Android NDK编译之undefined reference to 'JNI_CreateJavaVM'

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

XXX: undefined reference to `JNI_GetDefaultJavaVMInitArgs‘
XXX: 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'

原文地址:https://www.cnblogs.com/zhujiabin/p/10605639.html

时间: 2024-10-18 19:05:51

Android NDK编译之undefined reference to 'JNI_CreateJavaVM'的相关文章

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

最近在搞天使之翼的mrp模拟器... 移到AndroidStudio了,现在想把原来的Android .mk那种方式的改成cmake的方式编译,但是编译时有一些符号找不到. undefined reference,这些其实是在一个叫mr_gc的文件里的,但是没有这个文件.所以决定直接忽略找不到的符号,但是搜到的是Android.mk的 最后在这个blog发现了 https://blog.csdn.net/suningning/article/details/74509894 通过设置这个参数 A

Android NDK 编译加入so文件

在cocos2d-x中集成百度语音识别的时候,运行build_native.py会把libs/armeabi目录清空. 以下是解决办法,把so文件放在jni/prebuilt里面. 修改Android.mk文件,主要有两行include $(CLEAR_VARS) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) #百度语音识别so LOCAL_MODULE := BDVoiceRecognitionClient_V1 LOCAL_SRC_FI

arduino开发过程中编译问题undefined reference to `setup'的解决办法

今天遇到这个问题,搜了很久也没有找到真正的答案. 后来灵光乍现,原来是出现了相同的目标文件,既有maze.h和maze.cpp,又有maze.ino,于是编译连接的时候就会出现ld错误了. 将maze.ino重命名为任意不重复的名字,重新编译,问题解决! yeah! arduino开发过程中编译问题undefined reference to `setup'的解决办法

[ c++] cmake 编译时 undefined reference to `std::cout' 错误的解决方案

cmake ..  和 make 之后,出现如下错误 Linking CXX executable ../../../bin/ModuleTest CMakeFiles/ModuleTest.dir/tmp.cpp.o: In function `main': /ModuleTest/tmp.cpp:4: undefined reference to `std::cout' tmp.cpp 内容如下 1 #include <iostream> 2 3 int main(){ 4 std::co

android NDK编译(导入).a文件和编译多个so文件(转)

源:android NDK编译(导入).a文件和编译多个so文件 一.编译一个静态库 libstatic_android.a LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := static_android LOCAL_SRC_FILES := libstatic_android.a include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MOD

devc++编译时 undefined reference to `__imp_WSAStartup&#39;

socket编程时遇到的问题: devc++编译时 undefined reference to `__imp_WSAStartup' 原文地址:https://www.cnblogs.com/qy-blogs/p/9287145.html

Android编译错误——undefined reference to

[错误描述] 未定义引用 提示如下:bootable/recovery/minzip/Zip.c:1122: error: undefined reference to 'selabel_lookup'bootable/recovery/minzip/Zip.c:1123: error: undefined reference to 'setfscreatecon'bootable/recovery/minzip/Zip.c:1129: error: undefined reference to

[原]如何用Android NDK编译FFmpeg

\我们知道在Ubuntu下直接编译FFmpeg是很简单的,主要是先执行./configure,接着执行make命令来编译,完了紧接着执行make install执行安装.那么如何使用Android的NDK编译出来可以在Android下面可以使用的FFmpeg动态链接库呢?写下这篇文章就是学习如何裁剪并且编译出来可以使用的动态库. 一.获取FFmpeg源码: 首先在编译之前,得获取一份FFmpeg的源码,如果你没有git并且也不打算使用,你可以去FFmpeg官网http://ffmpeg.org/

android ndk 编译的时候指令集的选取

android ndk在编译的时候默认生成的是thumb指令(拇指)不是arm(手臂)指令,但是有时候在看反汇编的时候,不太熟悉thumb指令或者说thumb指令看起来更费劲,需要生成arm指令,这个时候,就需要在android.mk里面加入一条语句了. 在Android.mk中加入LOCAL_ARM_MODE := arm控制,默认情况下NDK使用Thumb指令集 这样再生成的指令就是arm指令了,用ida pro工具打开看变成4个字节一条指令而非2个字节一条指令了