JNI_OnLoad是否支持NativeActivity?配置后为何未被调用?
NativeActivity中JNI_OnLoad未被调用的排查方案
- 检查共享库的加载配置
NativeActivity默认加载libmain.so,如果你的库名不同,必须在AndroidManifest.xml的<application>内添加meta-data指定:
<meta-data android:name="android.app.lib_name" android:value="你的库文件名" />
系统只有正确加载你的共享库,才会触发JNI_OnLoad。
- 确认JNI_OnLoad的函数签名绝对正确
必须严格遵循标准签名,任何拼写、参数类型错误都会导致系统无法识别:
jint JNI_OnLoad(JavaVM* vm, void* reserved) { // 初始化逻辑 return JNI_VERSION_1_6; // 按需返回对应JNI版本 }
注意函数名是JNI_OnLoad(全大写开头),返回值为jint,参数是JavaVM指针和void指针,不能有任何偏差。
- 验证共享库的导出符号
用nm工具检查.so文件,确认JNI_OnLoad是全局导出符号:
nm -D lib你的库名.so | grep JNI_OnLoad
如果输出没有T JNI_OnLoad,说明函数未正确导出:
不要用
static修饰JNI_OnLoad若用C++编写,必须用
extern "C"包裹函数避免名字混淆:extern "C" { jint JNI_OnLoad(JavaVM* vm, void* reserved) { // ... return JNI_VERSION_1_6; } }排查NativeActivity启动状态
在ANativeActivity_onCreate中添加日志,确认进程正常启动。如果进程直接崩溃,用readelf -d lib你的库名.so检查依赖库是否在设备中存在。检查API版本兼容性
JNI_OnLoad在Android 2.3(API level 9)及以上才会被NativeActivity触发,确保minSdkVersion不低于9。
内容的提问来源于stack exchange,提问作者dawnmenu
相关产品推荐
相关产品推荐

