Android NDKコンパイルundefined reference to'JNI_CreateJavaVM'

1301 ワード

Android NDKでダイナミックライブラリをコンパイルし、Cファイルで2つのJNI関数を呼び出しました:JNI_GetDefaultJavaVMInitArgsとJNI_CreateJavaVM.コンパイル時に常に次のエラーが表示されます.
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);
これも私がよく使うダイナミックインタフェース登録関数です