JNI 检测到应用程序错误 java.lang.UnsatisfiedLinkError 在 android.tools.build 中找不到 "xxxxx.so":gradle 3.6.0
JNI DETECTED ERROR IN APPLICATION java.lang.UnsatisfiedLinkError couldn't find "xxxxx.so" in android.tools.build:gradle 3.6.0
我有一个包含一些原生 .so 的 .aar。 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 在 运行 时间内找不到错误,而 .so 就在 apk 中?
3.6.0 中发生的变化是 android:extractNativeLibs
默认 has changed:
The default value is "true" if extractNativeLibs is not configured in AndroidManifest.xml. However, when building your app using Android Gradle plugin 3.6.0 or higher, this property is reset to "false" if it is NOT configured in AndroidManifest.xml and minSdkVersion >= 23. If 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
}
}
问题是 some devices (e.g. Xiaomi) 仍然不支持非提取的本机库。
我有一个包含一些原生 .so 的 .aar。 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 在 运行 时间内找不到错误,而 .so 就在 apk 中?
3.6.0 中发生的变化是 android:extractNativeLibs
默认 has changed:
The default value is "true" if extractNativeLibs is not configured in AndroidManifest.xml. However, when building your app using Android Gradle plugin 3.6.0 or higher, this property is reset to "false" if it is NOT configured in AndroidManifest.xml and minSdkVersion >= 23. If 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 } }
问题是 some devices (e.g. Xiaomi) 仍然不支持非提取的本机库。