こんにちは、QTのAndroid

この記事では、Androidオペレーティングシステム用の1つのアプリケーションで友人をJavaおよびC ++言語にする方法について説明します。



大量のコードがC ++で記述されています。 アプリケーションでこのコードをなんとか使用したいのですが、何らかの理由で使用プロセスに不快感が生じました。 おそらく、これは、私の作業環境の基礎がAndroid Studioであるという事実によるものでした。AndroidStudioでは、ネイティブコードを使用するのが最善ではないと言えます。 しかし、ネイティブ部分を使用してアプリケーションを快適に開発するという考えは、私を決して忘れませんでした。 そのため、Qtライブラリの能力とAndroidのネイティブ言語であるJavaで作成されたアプリケーションを組み合わせることを試みることにしました。



現時点では、Qtエコシステムを使用すると、このフレームワークを使用してアプリケーションを完全に作成できます。さらに、Androidを含むオペレーティングシステムのセット全体用にコンパイルできます。 しかし、このように移動すると、プラットフォームガイドに従って表示および動作するインターフェイスを開発することは非常に困難です。 はい。Javaで記述されたライブラリを使用して、アプリケーションの外観と動作を設計することができなくなります。 そのため、すべてのビジネスロジックがC ++で記述され、ユーザーインターフェイスがターゲットプラットフォームのツールを使用して記述された開発モデルを試してみたいと思います。 将来的には、これにより、既にテストおよび延期されているターゲットシステムおよび機能の外観特性を備えた、他のプラットフォームへのアプリケーションの簡単な転送が提供されます。



そのため、次に、Qtで記述された部分とJavaで記述された部分を持つアプリケーションを作成する方法に関する指示を見つけます。



動作させるには、Qtライブラリとide Qt Creatorが必要です。これは、Androidプロジェクト(これは非常に簡単です。 リンクについてはこちらをご覧ください )、 Android StudioAndroid ndkで動作するように構成されています。



1.まず、Androidプロジェクトを作成して(QTtestsと呼びましょう)、「penguin.in.flight.qttests」をパッケージの名前として設定する必要があります。 プロジェクト作成ウィザードの次の段階で、作業に便利な設定を選択できます。 さらに指示に従うことができるための主な条件は、パッケージ名に従うことです。



Android Studioで新しいプロジェクトを作成する
画像



2. Androidプロジェクトが既に存在する場合、しばらく忘れて、Qtパーツの作成に進むことができます。 最初のステップは、ライブラリなどの標準プロジェクトを(できればメインプロジェクトのルートに)作成することです。 cpp_libという名前を付けます。 プロジェクトを作成するときに、ターゲットプラットフォームとしてarmeabi-v7を選択します。



ライブラリ作成








3.これでプロジェクトテンプレートが作成されました。次はQtでHello Wordを作成します。

cpp_lib.h



#ifndef CPP_LIB_H #define CPP_LIB_H #include "cpp_lib_global.h" #include <jni.h> #include <QString> class CPP_LIBSHARED_EXPORT Cpp_lib { public: Cpp_lib(); QString say(QString subject); }; #ifdef __cplusplus extern "C" { #endif JNIEXPORT jstring JNICALL Java_penguin_in_flight_qttests_utils_JavaNatives_sayHello(JNIEnv *env, jobject obj); #ifdef __cplusplus } #endif #endif // CPP_LIB_H
      
      





cpp_lib.cpp



 #include "cpp_lib.h" Cpp_lib::Cpp_lib() { } QString Cpp_lib::say(QString subject) { QString result = QString("Qt say \" %1 \"").arg(subject); return result; } JNIEXPORT jstring JNICALL Java_penguin_in_flight_qttests_utils_JavaNatives_sayHello(JNIEnv *env, jobject obj){ Cpp_lib *lib = new Cpp_lib(); return env->NewStringUTF(lib->say("Hello android!!!").toLatin1().data()); }
      
      





コードからわかるように、アプリケーションは非常に単純です。 これには、sayとJava_penguin_in_flight_qttests_utils_JavaNatives_sayHelloという2つの関数が含まれています。 1つ目はシンプルで簡単です。 フレームワークではテキスト文字列である入力オブジェクトを受け取り、新しい行を提供します。 次の関数はさらに興味深いものです。 その中で、JNIEXPORTとJNICALLは、Javaで記述されたコードから呼び出すことができることを意味します。 戻り値の型としてjstringがあります(この包含#include <jni.h>のおかげで利用可能です)。 この型は、JavaのString型です。



結論として、メソッドの引数を分析します。 * envは、Javaエンティティの操作に必要なメソッドを含む構造への参照であり、objはメソッドを呼び出したオブジェクトです。



3.コードの作成後、ライブラリが正しくアセンブルされ、プロジェクトで使用できることを確認する必要があります。 これを行うには、プロジェクト設定ファイルのこの行TEMPLATE = libを削除する必要があります(この場合、cpp_lib.proです)。 これを行わないと、アセンブリ中に次のようなエラーが発生します。



内部エラー:.proファイルが見つかりませんでした。

プロジェクトcpp_libのビルド/デプロイ中のエラー(キット:armeabi-v7aのAndroid(GCC 4.9、Qt 5.4.1))

ステップ「Android APKのビルド」を実行するとき



4.次に、Qt Creatorに次のアドレスでライブラリをビルドさせる必要があります:{project_path} / QTtests / app / src / main / qt_output:



ビルドフォルダーを設定する






5.アセンブリの場所を示したのと同じ場所で、アプリケーションのビルド設定を確認する必要があります。 つまり、ターゲットアセンブリプラットフォームです。 後者を選択する必要があります(Android 22があります)。 次に、APKでQtライブラリをビルドするの横にあるチェックボックスをオンにします。 これは、ビルドシステムが必要なすべてのライブラリを生成するために必要です。 また、Use Gradleの横にあるチェックボックスをオンにする必要があります。これにより、ビルドシステムが必要なタイプのプロジェクトを生成します。



設定のスクリーンショット






6.これで、ライブラリを構築し、必要なすべてのファイルを取得できます。



プロジェクトを組み立てる






7.ここで、ネイティブライブラリでの作業が終了します。 Androidスタジオに戻ります。 最初に行うことは、アセンブリファイルを編集してQtライブラリを有効にすることです。 これを行うには、ファイル/QT_tests/app/build.gradleに次の行を追加します。



  sourceSets { main { java.srcDirs += ['/src/main/java'] res.srcDirs += ['src/main/res','src/main/qt_output/android-build/res'] jniLibs.srcDirs += 'src/main/qt_output/android-build/libs' } }
      
      





src / main / qt_output / android-build / resは、メインQtプロジェクトが依存するライブラリ名をビルドシステムが登録したリソースにアクセスするために必要です。 パスsrc / main / qt_output / android-build / libsは、ライブラリファイル自体が存在する場所を指します。



依存関係ブロックも次のように変更します。



 dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile files('src/main/qt_output/android-build/libs/QtAndroid-bundled.jar') compile files('src/main/qt_output/android-build/libs/QtAndroidAccessibility-bundled.jar') //  }
      
      







8.これでライブラリコレクションが作成され、プロジェクトにも接続されました。 次に、プログラム自体の起動中にそれらを接続する必要があります。 これを行うには、次のクラスを使用します。



 package penguin.in.flight.qttests.utils; import android.content.Context; import android.util.Log; import penguin.in.flight.qttests.R; /** * Created on 11.04.15. */ public class JavaNatives { public native static String sayHello(); public static void init(Context context) { load(context, R.array.bundled_in_assets); load(context, R.array.qt_libs); System.loadLibrary("cpp_lib"); } static void load(Context context, int arrayResourceId) { String[] libsToLoad = context.getResources().getStringArray(arrayResourceId); for (String lib : libsToLoad) { if (lib.indexOf('/') > -1) { lib = lib.substring(lib.indexOf('/')); } if (lib.indexOf("lib") == 0) { lib = lib.substring(3); } if (lib.endsWith(".so")) { lib = lib.substring(0, lib.length() - 3); } Log.i(JavaNatives.class.getSimpleName(), "loading " + lib); try { System.loadLibrary(lib); } catch (Throwable e) { Log.i(JavaNatives.class.getSimpleName(), "failed to load " + lib + " " + e); e.printStackTrace(); } Log.i(JavaNatives.class.getSimpleName(), "Successfully loaded " + lib); } } }
      
      





コードからわかるように、クラスはパッケージpenguin.in.flight.qttests.utilsにあり、JavaNativesと呼ばれています。 これは、ネイティブ部分で記述したコード間の接続を確保するために重要です。 方法を理解するために、Java_penguin_in_flight_qttests_utils_JavaNatives_sayHelloというメソッドを思い出してみましょう。 その名前はJava_プレフィックスで構成され、サブパッケージの名前は記号「_」(penguin_in_flight_qttests_utils)で区切られたパッケージの名前になります。 次にクラス名、最後にメソッド名が続きます。 ネイティブコードのメソッドの命名については、 こちらをご覧ください



9.開始アクティビティでonCreateで記述したクラスを使用するには、次の行を挿入する必要があります。



 JavaNatives.init(this);
      
      





10.今、私たちが書いたものを使うだけです。 これを行うには、ボタンを追加し、それをクリックする処理で、次のコードを挿入します。



 AlertDialog.Builder dialog = new AlertDialog.Builder(this); dialog.setMessage(JavaNatives.sayHello()); dialog.setPositiveButton("Ok", null); dialog.show();
      
      





これで、Qtで記述されたネイティブ部分をAndroidアプリケーションで使用するための指示は終わりました。



ご清聴ありがとうございました。すべてのサンプルコードはgithub.comで入手できます。



All Articles