JNI 在应用程序 java.lang.UnsatisfiedLinkError 中检测到错误在 android.tools.build:gradle 3.6.0 中找不到“xxxxx.so”

问题描述 投票:0回答:2

我有一个 .aar,其中包括一些本机 .so。 Andrid 项目 B 实现了这个 .aar,如下所示:

    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation(name: 'abcd', ext:'aar')
        implementation(name: 'somethingelse', ext:'aar')
    }

在Android项目B中,当我使用android.tools.build:gradle 3.4.0和3.5.0时,一切正常。但是当我在根 gradle 中更改为 3.6.0 时:

    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.0' // dont work
        classpath 'com.android.tools.build:gradle:3.4.0' // works fine
    }

运行时出现错误,例如:

2021-05-24 20:41:55.723 6064-6153/com.xxxx.xxxxx A/xxxx: java_vm_ext.cc:577] JNI DETECTED ERROR IN APPLICATION: JNI GetMethodID called with pending exception java.lang.UnsatisfiedLinkError: dalvik.system.DexClassLoader[DexPathList[[zip file "/data/app/~~tqEwSNB6cPXs4GapbzXZzQ==/com.xxxx.xxxxx-TRHmC-RfgNxXwoU9Ax-Hrw==/base.apk"],nativeLibraryDirectories=[/data/app/~~tqEwSNB6cPXs4GapbzXZzQ==/com.xxxx.xxxxx-TRHmC-RfgNxXwoU9Ax-Hrw==/lib/arm64, /system/lib64, /system_ext/lib64]]] couldn't find "libcamera_lib.so"
java_vm_ext.cc:577]   at void java.lang.Runtime.loadLibrary0(java.lang.ClassLoader, java.lang.Class, java.lang.String) (Runtime.java:1083)
java_vm_ext.cc:577]   at void java.lang.Runtime.loadLibrary0(java.lang.Class, java.lang.String) (Runtime.java:1008)
java_vm_ext.cc:577]   at void java.lang.System.loadLibrary(java.lang.String) (System.java:1664)

高亮度:

nativeLibraryDirectories=[/data/app/~~tqEwSNB6cPXs4GapbzXZzQ==/com.xxxx.xxxxx-TRHmC-RfgNxXwoU9Ax-Hrw==/lib/arm64, /system/lib64, /system_ext/lib64]]] couldn't find "libcamera_lib.so"

但是当我解压并检查 aar 甚至最终输出的 apk 时,我确实发现 cmera_lib.so 就在那里。

知道那里发生了什么吗?为什么更改 android.tools.build:gradle 会导致运行时出现 .so not find 错误,而 .so 就在 apk 内部?

java android gradle java-native-interface
2个回答
3
投票

3.6.0 中发生的变化是

android:extractNativeLibs
默认 已更改:

如果 AndroidManifest.xml 中未配置 extractNativeLibs,则默认值为“true”。但是,当使用 Android Gradle 插件 3.6.0 或更高版本构建应用程序时,如果未在 AndroidManifest.xml 中配置且 minSdkVersion >= 23,则此属性将重置为“false”。如果 minSdkVersion < 23 and extractNativeLibs is explicitly set to "false" in AndroidManifest.xml, you must add the following to your app's build.gradle file:

packagingOptions {
  jniLibs {
    useLegacyPackaging = false
  }
}

问题是一些设备(例如小米)仍然不支持非提取的本机库。


0
投票

我是这样解决的,通过在AndroidManifest.xml中配置应用程序节点 Android:extractNativeLibs="true",并且Gradle中不需要配置任何东西,所以再次运行不会报错。 我希望我能帮助你。

android:extractNativeLibs="true"
© www.soinside.com 2019 - 2024. All rights reserved.