私はAndroidアプリケーションを書いています。JNI を使用して C++ でアプリの一部を実装しています。JNI (C++) コードを Java Android コードから実際に完全に分離する方法はありますか? JNIプロジェクトか何かを作成するのが好きですか?私の C++ コードは、別のアプリで使用する小さなライブラリになるからです。C++ プロジェクトを作成しようとしましたが、ndk-build でコンパイルできません。
2 に答える
実際には、Java とネイティブ コードの間の結合は、実行時にメソッドの名前によって行われるという点で、かなりゆるいものです。
NDK は、C コンパイラ用の特別な環境とライブラリにすぎません。適切な動的ライブラリ ファイルを作成する必要がありますが、これは ndk スクリプトを使用するか、ndk によって生成された「スタンドアロン ツール チェーン」を使用するか、別のマシンで実行される Java プロジェクトのビルドの前 (または後で参照) で実行できます。等
通常、.so 動的ライブラリはアプリケーション プロジェクト ツリーの適切な場所にコピーされ、最終的に .apk にパッケージ化され、System.loadLibrary() メソッドによって自動的に検出されるデバイスにインストールされます。ただし、完成した .apk (特別な配置と jarsigner 署名を含む zip ファイル) に挿入することもできます。しかし、実際には .pak でさえデバイスに配信する唯一の方法ではありません (推奨される唯一の方法ですが) - ライブラリをアプリのプライベート フォルダーなどの場所に保存し、System.load( を使用してロードすることもできます。 ) ライブラリ名の代わりにフルパス名を取ります。
hotverspicy には、Java コードが jni ライブラリに実装されているものに対してネイティブ メソッドの「宣言」が必要であり、これがネイティブ関数実装の名前にエンコードされている実際のパッケージ名と一致する必要があるという点があります。ただし、そのパッケージ名は Java コードの残りの部分と同じである必要はありません。これは、再利用可能な C/C++ ライブラリの一般的なものである可能性があり、一致する Java パッケージ内の一致する Java クラス ファイルが 1 つだけ必要になります。名前。
しかし、あるネイティブ ライブラリを使用して別のネイティブ ライブラリに接続するという Neevek のアイデアに加えて、オブジェクト ファクトリ メカニズムを使用して、実行時に任意のネイティブ関数をフックすることも可能です。 C/C++ Reflection および JNIへ- まだ作成されていないネイティブ コードを呼び出す方法
Android.mk
C++ コードで JNI を使用する場合、JNI は Android にバインドされ、適切に定義された , Application.mk
(オプション)を持つ Android プロジェクトである必要があります。
コードで JNI API を使用しない場合、たとえば汎用ライブラリを作成したい場合は、C++ コードを記述してコンパイルし、通常どおりテストするだけで済みndk-build
ます。必要ありません。ライブラリでのコーディングが完了したら、コードを静的ライブラリとしてビルドします。Android プロジェクトでこの静的ライブラリを使用する場合は、使用する静的ライブラリの機能の周りにいくつかの JNI ラッパーを記述し、静的ライブラリに対してリンクします。あなたのライブラリAndroid.mk
、次のようなもの:
include $(CLEAR_VARS)
LOCAL_MODULE := libgeneric
LOCAL_SRC_FILES := prebuilt/libgeneric.a
include $(PREBUILT_STATIC_LIBRARY)