Android NDK编译之undefined reference to 'JNI_CreateJavaVM'

Posted zhujiabin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android NDK编译之undefined reference to 'JNI_CreateJavaVM'相关的知识,希望对你有一定的参考价值。

利用android NDK编译动态库,在C文件中调用了两个JNI函数:JNI_GetDefaultJavaVMInitArgs和JNI_CreateJavaVM。编译的时候始终报以下错误:

XXX: undefined reference to `JNI_GetDefaultJavaVMInitArgsXXX: undefined reference to `JNI_CreateJavaVM

看了网上很多人的解答,基本都是添加libjvm.so或者libnativehelper库。尝试下,没有一个靠普的。不是说人家的方法不靠普,而是这种方法不适合用于Android。原因是NDK根本没有将这两个接口导出来,这个在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

看,这里显然将两个函数给屏蔽掉了,所以不能直接用。

 看来常规的JNI有些时候对Android不适用。虽然Android将这条路封了,不过还是开了另外一扇门,给了另外两个函数用于注册自己编写的本地JNI函数,见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);

这个也是我经常用的动态接口注册函数

以上是关于Android NDK编译之undefined reference to 'JNI_CreateJavaVM'的主要内容,如果未能解决你的问题,请参考以下文章

安卓ndk 忽略 error: undefined reference to '找不到符号

NDK undefined reference to 'rand'

android ndk error: undefined reference to '__memcpy_chk'

android ndk error: undefined reference to '__memcpy_chk'

Windows编译OpenCV4Android解决undefined reference to std错误

Android NDK——源码编译脚本之Makefile 基础语法和Android.mk小结