Android中.so文件缺失Native函数符号引发Unsatisfied Link Error求助
排查JNI UnsatisfiedLinkError(找不到Native函数实现)
针对你遇到的问题,结合提供的代码,从以下几个核心点排查:
1. JNI函数参数不符合规范
非静态Native函数必须接收两个强制参数:JNIEnv*(JNI环境指针)和jobject(当前类的实例对象),你的C++代码完全遗漏了这两个参数,导致函数签名与JVM期望的不匹配,最终无法生成正确的符号。
修正后的C++函数:
extern "C" JNIEXPORT jboolean JNICALL Java_abc_def_xyz_MainActivity_MyNativeFunction(JNIEnv* env, jobject thiz) noexcept { // 你的业务代码 return JNI_TRUE; // 建议使用JNI规范的宏替代原生bool值 }
2. 确认Kotlin类的全限定名
检查Kotlin文件的包声明:你的代码中导入了abc.def.xyz,但MainActivity是否真正属于该包?需在Kotlin文件顶部明确添加包声明:
package abc.def.xyz import android.app.Activity import android.os.Bundle class MainActivity : Activity() { // ... 你的代码 }
只有类的全限定名是abc.def.xyz.MainActivity,JNI函数的前缀Java_abc_def_xyz_MainActivity_才会匹配。
3. 确保Native库被正确加载
在Kotlin类中添加静态代码块,提前加载对应的.so库:
class MainActivity : Activity() { companion object { init { System.loadLibrary("your-lib-name") // 替换为你的so库名(不带lib前缀和.so后缀) } } public external fun MyNativeFunction(): Boolean override fun onCreate(pSavedInstance: Bundle?) { super.onCreate(pSavedInstance) val check = MyNativeFunction() } }
未加载库时,JVM无法定位到so文件,必然抛出链接错误。
4. 验证编译脚本与符号生成
- 检查CMakeLists.txt或ndk-build脚本,确保你的C++文件被包含进编译目标:
add_library( your-lib-name SHARED path/to/your-source-file.cpp # 替换为你的C++文件路径 ) - 编译完成后,用
nm -D your-lib.so命令查看so中的符号,确认是否存在Java_abc_def_xyz_MainActivity_MyNativeFunction。如果没有,说明该函数未被编译进so库。
内容的提问来源于stack exchange,提问作者Rohan Pande
相关产品推荐
相关产品推荐

