未找到Android本机库依赖项

时间:2015-06-30 08:48:37

标签: android android-studio gradle android-gradle

在我的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文件夹中。这种散射方法意味着所有六个库都已安装并可用。

一旦我们弄清楚为什么会发生这种情况,我就会更新。

0 个答案:

没有答案