Android Studio添加.so文件遇UnsatisfiedLinkError问题求助
解决Android Studio中JNI UnsatisfiedLinkError问题
你遇到的java.lang.UnsatisfiedLinkError是典型的JNI链接错误,意味着虚拟机找不到ActivateLibrary这个原生方法的实现。咱们从几个关键方向排查解决:
1. 确认.so文件中的函数签名完全匹配
错误提示里明确说找不到Java_com_getmagnet_App_MR_ActivateLibrary和Java_com_getmagnet_App_MR_ActivateLibrary__Ljava_lang_String_2这两个符号,这说明你的.so文件里没有和Java端方法完全匹配的原生函数。
你可以用工具检查.so文件的符号表:
- 在Linux/macOS下,使用命令:
nm -D MirrorRealitySDK.so | grep ActivateLibrary - 确认输出中存在正确的函数签名,注意包名、类名、方法名的大小写,以及参数的JNI类型签名(String对应
Ljava/lang/String;,所以带参数的签名应该是Java_com_getmagnet_App_MR_ActivateLibrary__Ljava_lang_String_2)。
- 在Linux/macOS下,使用命令:
原生代码中的函数必须严格遵循JNI规范,比如:
JNIEXPORT jint JNICALL Java_com_getmagnet_App_MR_ActivateLibrary(JNIEnv* env, jclass clazz, jstring licenseKey) { // 你的实现逻辑 }
要保证返回类型是jint(对应Java的int),参数顺序是JNIEnv*、jclass(因为是静态方法)、jstring,缺一不可。
2. 检查.so文件的加载逻辑与存在性
你的MR类中加载了三个库,要确保:
- 加载顺序正确:
stlport_shared和fsdk是MirrorRealitySDK的依赖库,必须先加载依赖库再加载主库,当前的顺序是对的,但要确认这些库都存在于对应ABI目录(jniLibs/armeabi-v7a和jniLibs/x86)中。 - 测试设备的CPU架构是否匹配:如果你的测试设备是arm64-v8a架构,只提供armeabi-v7a的.so可能会有兼容问题,可以在
build.gradle中指定支持的ABI:
android { defaultConfig { ndk { abiFilters 'armeabi-v7a', 'x86' } } }
3. 简化Gradle配置,避免打包问题
你当前的Gradle配置把.so打包成jar,这其实是不必要的——Android Studio默认会自动识别src/main/jniLibs目录下的.so文件并打包到APK中。建议:
- 移除你添加的以下Gradle代码:
compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar') task nativeLibsToJar(type: Jar, description: 'create a jar archive of the native libs') { destinationDir file("$buildDir/native-libs") baseName 'native-libs' from fileTree(dir: 'libs', include: '**/*.so') into 'lib/' } tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn(nativeLibsToJar) }
- 如果你的.so文件不在默认的
src/main/jniLibs目录,只需在build.gradle中指定路径即可:
android { sourceSets { main { jniLibs.srcDirs = ['libs'] // 替换成你的.so实际存放目录 } } }
4. 清理缓存并重建项目
有时候Android Studio的缓存会导致异常,执行以下步骤:
- 点击菜单栏
Build -> Clean Project - 然后点击
Build -> Rebuild Project - 也可以手动删除项目根目录下的
build文件夹,再重新构建。
5. 验证APK中的.so文件是否正确打包
解压生成的APK文件,查看lib目录下的对应ABI文件夹(比如lib/armeabi-v7a),确认stlport_shared.so、fsdk.so、MirrorRealitySDK.so这三个文件都存在且完整。
内容的提问来源于stack exchange,提问作者WalksAway
相关产品推荐
相关产品推荐

