【问题标题】:Can't add .so file to Android Studio 3.5.3 using jniLibs无法使用 jniLibs 将 .so 文件添加到 Android Studio 3.5.3
【发布时间】:2020-02-17 08:51:56
【问题描述】:

我正在尝试将 .so 文件添加到新的 Android 项目。我正在使用 Android Studio 3.5.3。我已经完成了推荐的 herehere ;所以我在 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


【解决方案1】:

您可以使用 NDK 手动生成 .so 文件。然后你可以在你的 jni 文件夹中添加 lib.so 文件。

将 NDK 路径添加到 local.properties。

参考这个页面:https://developer.android.com/studio/projects/gradle-external-native-builds

如果它不起作用。您可以创建 javah 然后您可以访问它。 制作 javah 的链接:https://developer.android.com/training/articles/perf-jni

【讨论】:

  • 我不确定我明白你在说什么。我已经有了 .so 文件(我自己在另一台机器上编译它,使用 Ubuntu)。我将文件放在正确的 jni 文件夹(jniLibs/arm64-v8a)中,它说它不存在
  • 将 NDK 路径添加到 local.properties。
  • 谢谢。我找到了一种更好的方法来指向正确的 NDK 位置,因为不建议编辑该文件。从 Android Studio 添加 NDK 位置:文件 > 项目结构 > SDK 位置 > Android NDK 位置。不过,错误是一样的
  • 试试这个。 sourceSets { main { jniLibs.srcDirs 'imported-lib/src/', 'more-imported-libs/src/' } }
  • 谢谢,试过了,还是不行。而且我看不出它是如何工作的,因为正确的路径是'src/main/jniLibs'
猜你喜欢
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 2016-02-07
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多