在我的Android Studio项目中,我使用了第三方库(我无法编辑),这需要几个本机库。当我在我的应用程序中访问此第三方库时,出现以下错误:
java.lang.UnsatisfiedLinkError: Couldn't load avutil-52 from
loader dalvik.system.PathClassLoader
[dexPath=/data/app/com.myApp.debug.apk,
libraryPath=/data/app-lib/com.myApp.debug]:
findLibrary returned null
我使用Android Studio 1.2.2,因此Gradle支持使用jniLibs文件夹。我的Gradle构建文件为安全性指定了jniLibs文件夹:
android {
sourceSets {
main {
java {
srcDir 'src/main/src'
}
jniLibs {
srcDirs 'src/main/jniLibs'
}
}
}
}
这里我有我的图书馆:
src/main/jniLibs/armeabi/*.so
该文件夹包含一些其他库,这些库在应用程序中工作,所以我知道该文件夹正在被包含。
当我检查生成的APK时,所有* .so文件都包含在libs文件夹中。但是,当我检查已安装的应用程序时,我只找到了预期的六个库中的三个:
adb shell ls /data/app-lib/com.myApp
first.so
second.so
third.so
我还检查了/data/data/com/myApp.debug/app_lib/
文件夹,其他三个依赖项都没有。
不是原生Android开发者,我发现这非常令人费解。可能导致某些依赖项被包含在内,还有其他依赖项被排除在外?有没有办法强制Android识别三个丢失的文件,并确保它们已安装?当然,无需编辑使用它们的第三方库。
编辑1:
来自第三方库的此代码是否会导致问题?
public StartFunction() {
String arch = System.getProperty("os.arch");
this.ARM = arch.toUpperCase().contains("ARM") || arch.toUpperCase().contains("AARCH64");
if(this.ARM) {
this.LoadLibraries();
}
}
private void LoadLibraries() {
System.loadLibrary("first");
System.loadLibrary("second");
System.loadLibrary("third");
System.loadLibrary("fourth");
System.loadLibrary("fifth");
System.loadLibrary("sixth");
}
编辑2:
这是logcat的完整例外。包名称略有改变以保护有罪。
06-30 09:19:08.505 15069-15069/com.myApp.debug E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.myApp.debug, PID: 15069
java.lang.UnsatisfiedLinkError: Couldn't load avutil-52 from loader dalvik.system.PathClassLoader[dexPath=/data/app/com.myApp.debug-1.apk,libraryPath=/data/app-lib/com.myApp.debug-1]: findLibrary returned null
at java.lang.Runtime.loadLibrary(Runtime.java:358)
at java.lang.System.loadLibrary(System.java:526)
at com.thirdPartyApp.embedded.Call.LoadLibraries(Call.java:289)
at com.thirdPartyApp.embedded.Call.<init>(Call.java:214)
at com.thirdPartyApp.embedded.thirdPartyCall$29.run(thirdParty.java:963)
at com.thirdPartyApp.embedded.DownloadFile.onPostExecute(DownloadFile.java:56)
at com.thirdPartyApp.embedded.DownloadFile.onPostExecute(DownloadFile.java:16)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5487)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
编辑3:
我设法让这个工作,但是以一种肮脏的方式。我不知道为什么会发生这种情况,但我确实知道发生了什么:
我使用放置在src/main/jniLibs/armeabi
中的第三方SDK所需的所有六个编译库。传统观点认为这适用于所有ARM设备。但是,在ARM设备上安装应用程序时,只安装了六个库中的三个。
肮脏的解决方案:将所有六个库也放在src/main/jniLibs/armeabi-v7a
文件夹中。这种散射方法意味着所有六个库都已安装并可用。
一旦我们弄清楚为什么会发生这种情况,我就会更新。