【发布时间】:2020-02-17 08:51:56
【问题描述】:
我正在尝试将 .so 文件添加到新的 Android 项目。我正在使用 Android Studio 3.5.3。我已经完成了推荐的 here 和 here ;所以我在 src/main 中创建了文件夹(jniLibs/arm64-v8a 等)并将其添加到 app/build.gradle: p>
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
我将 libhl.so 文件放在 /app/src/main/jniLibs/arm64-v8a 中(是的,64 位应该没问题)。该项目可以正常编译,但在执行时会在 logcat 中显示以下错误:
02-17 10:25:31.719 3691-3691/com.example.bmdtest03 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.bmdtest03, PID: 3691
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.bmdtest03-2/base.apk"],nativeLibraryDirectories=[/data/app/com.example.bmdtest03-2/lib/x86_64, /vendor/lib64, /system/lib64]]] couldn't find "libhl.so"
at java.lang.Runtime.loadLibrary(Runtime.java:366)
at java.lang.System.loadLibrary(System.java:989)
at com.example.bmdtest03.MainActivity.<clinit>(MainActivity.java:14)
at java.lang.reflect.Constructor.newInstance(Native Method)
at java.lang.Class.newInstance(Class.java:1572)
at android.app.Instrumentation.newActivity(Instrumentation.java:1065)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
结论:文件在那里,源代码在 build.gradle 中更新,我缺少什么?
【问题讨论】:
-
读取错误。它告诉你它在哪里寻找:
nativeLibraryDirectories=[/data/app/com.example.bmdtest03-2/lib/x86_64, /vendor/lib64, /system/lib64]这告诉我你正在运行模拟器(它使用 x86_64 架构)并试图为它提供一个使用 arm64-v8a 架构的预编译库。这永远不会奏效,即使它确实找到了文件。 -
剩下两个选择:为 x86_64 重新编译 .so 文件并在模拟器中测试,或者在真正的 Android 设备上测试(确保它是 64 位!)。
标签: android android-ndk