2016-10-10 7 views
0

Android NDKを使用してアンドロイドにC++ライブラリを作成しています。ライブラリにはJavaVMとAAssetManagerが必要です。問題は、私たちのライブラリ内のJavaVMとAAssetManagerにアクセスする方法がないことです。ネイティブC++ AndroidライブラリのJavaVMとAAssetManagerを取得

私が知っているのである:ネイティブホストアプリケーションで

  1. ホストアプリケーションでもあるならば、それは働くことができないようですjavaの
  2. jint JNI_OnLoad(JavaVM* vm, void* reserved) 場合、我々はANativeActivity
  3. AAssetManager_fromJavaからそれらを得ることができますネイティブC++

ライブラリは、ユーザーに配布されます。ユーザーにJavaVMとAAssetManagerを強制的に設定させるのはエレガントではありません。あなたは何か考えていますか?おかげ

答えて

0

あなたは(「一般的な」と「ネイティブ」アプリ)と同じ方法で、両方のケースをカバーしたい場合は - 唯一の方法は次です:

  • は、あなたのライブラリにMyLibrary.javaを追加します。そのファイルはネイティブメソッドMyLibrary.init(AssetManager am);を宣言する必要があります。そのメソッドの実装では、アセット・マネージャーへのJava参照を取得し、その後AAssetManager *
  • JavaVM*
  • は、システムを許可するために、別.soとして、あなたのライブラリーを構築し得るために、あなたのライブラリにJNI_OnLoad()を追加取得することができ、あなたのC++コードに配置する必要があります起動するには、あなたのJNI_OnLoad()

使用法は、次なります

  • クライアントアプリは、そのマニフェストでカスタムApplicationクラスを宣言しています
  • このカスタムクラスの実装はonAttachBaseContext()メソッドをオーバーライドします。この実装ではSystem.loadLibrary("mylibrary")が呼び出され、次にMyLibrary.init(getAssets())が呼び出されます。
関連する問題