Android无法加载生成的Native库问题求助
核心原因
你现在遇到的问题本质是运行环境不匹配:你直接在本地JVM(电脑的Java虚拟机)里运行TestClass的main方法,但Android Studio构建出来的libnative-lib.so是专门针对Android设备架构(比如armeabi-v7a、arm64-v8a等)编译的,本地JVM(x86/x64架构)既无法识别这些Android专用的so文件,也找不到APK里的so存放路径,所以才会抛出UnsatisfiedLinkError。
正确的Android环境测试方案(推荐)
因为你开发的是Android库,最准确的测试方式是在Android设备或模拟器上运行,步骤如下:
创建Instrumented测试类
在app/src/androidTest/java/com/example/目录下新建测试类:package com.example; import android.support.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class NativeLibTest { @Test public void testHelloNative() { new TestClass().helloNative(); } }右键这个类选择「Run」,在连接的Android设备或模拟器上执行,就能正确加载APK里的native库了。
确认Gradle与CMake配置正确
检查你的app/build.gradle是否包含正确的NDK构建配置:android { ... defaultConfig { ... externalNativeBuild { cmake { cppFlags "" // 指定需要支持的Android架构,默认会生成主流架构版本 abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } } } externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" // 指向你的CMake配置文件 } } }同时确认
src/main/cpp/CMakeLists.txt里正确声明了native库:add_library( native-lib SHARED native-lib.cpp ) find_library( log-lib log ) target_link_libraries( native-lib ${log-lib} )
本地JVM测试方案(不推荐,仅作验证)
如果非要在本地电脑的JVM里测试native方法,需要单独编译适配本地架构的so文件:
生成JNI头文件
在Terminal中进入app/src/java目录,执行以下命令:javac com/example/TestClass.java javah com.example.TestClass会生成
com_example_TestClass.h头文件。编译本地so文件
使用gcc/g编译(需要提前安装C编译工具链):# Linux/macOS示例,替换$JAVA_HOME为你的JDK路径 g++ -shared -fPIC -I$JAVA_HOME/include -I$JAVA_HOME/include/linux com/example/TestClass.java native-lib.cpp -o libnative-lib.so指定库路径运行
在Android Studio的Run Configuration中,给TestClass的运行配置添加VM参数:-Djava.library.path=/你的so文件所在目录路径或者直接在Terminal中运行:
java -Djava.library.path=. com.example.TestClass
总结
优先选择Android设备/模拟器测试,因为本地JVM的JNI行为和Android环境存在差异,测试结果不能完全代表实际Android设备上的运行情况。
内容的提问来源于stack exchange,提问作者user7046622

