Android NDKコンパイルundefined reference to'JNI_CreateJavaVM'
1301 ワード
Android NDKでダイナミックライブラリをコンパイルし、Cファイルで2つのJNI関数を呼び出しました:JNI_GetDefaultJavaVMInitArgsとJNI_CreateJavaVM.コンパイル時に常に次のエラーが表示されます.
通常のJNIはAndroidに適用されない場合があるようです.Androidはこの道を閉鎖したが、別のドアを開けて、自分が書いたローカルJNI関数を登録するために別の2つの関数を与えた.jniを参照.hの1125行、内容は以下の通りである.
XXX: undefined reference to `JNI_GetDefaultJavaVMInitArgs'
XXX: undefined reference to `JNI_CreateJavaVM'
ネット上の多くの人の解答を見て、基本的にlibjvmを追加します.soまたはlibnativehelperライブラリ.試してみると、普通の人は一人もいません.人のやり方は普通ではないというのではなく、Androidには向いていない.なぜならNDKはこの2つのインタフェースをまったく導き出していないからです.これはjniです.hには説明があり、1110行にあり、内容は以下の通りである./*
* VM initialization functions.
*
* Note these are the only symbols exported for JNI by the VM.
*/
#if 0 /* In practice, these are not exported by the NDK so don't declare them */
jint JNI_GetDefaultJavaVMInitArgs(void*);
jint JNI_CreateJavaVM(JavaVM**, JNIEnv**, void*);
jint JNI_GetCreatedJavaVMs(JavaVM**, jsize, jsize*);
#endif
見て、ここでは明らかに2つの関数を遮断しているので、直接使うことはできません.通常のJNIはAndroidに適用されない場合があるようです.Androidはこの道を閉鎖したが、別のドアを開けて、自分が書いたローカルJNI関数を登録するために別の2つの関数を与えた.jniを参照.hの1125行、内容は以下の通りである.
/*
* Prototypes for functions exported by loadable shared libs. These are
* called by JNI, not provided by JNI.
*/
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved);
JNIEXPORT void JNI_OnUnload(JavaVM* vm, void* reserved);
これも私がよく使うダイナミックインタフェース登録関数です