dalvik.system.PathClassLoader无法在Intel设备上找到jni

时间:2014-12-05 21:42:19

标签: android gradle dalvik unsatisfiedlinkerror android-x86

我遇到的问题是dalvik.system.PathClassLoader无法在英特尔设备上找到我的jni文件。我认为它与我所拥有的aar依赖的结构有关,因为一旦我删除了该依赖项,就会发现jni文件没有问题。我的aar依赖有x86和arm库,我的项目只有arm库。

文件夹结构为:

我的项目

  
      
  • SRC      
        
    • jniLibs      
          
      • armeabi      
            
        • libLibraryA.so
        •   
      •   
    •   
  •   

我的AAR依赖项目有:

  
      
  • SRC      
        
    • jniLibs      
          
      • armeabi      
            
        • libLibraryB.so
        •   
      •   
      • 86      
            
        • libLibraryB.so
        •   
      •   
    •   
  •   

使用该结构,将无法在x86设备上找到libLibraryA.so。我不确定这是否是gradle打包问题,或者这是否是dalvik / runtime问题。我不知道下一步该往哪里去。我得到的错误是:

  FATAL EXCEPTION: main 
  Process: com.project, PID: 10850 
 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/base.apk"],nativeLibraryDirectories=[/lib/x86, /vendor/lib, /system/lib]]] couldn't find "libLibraryA.so" 
 at java.lang.Runtime.loadLibrary(Runtime.java:366) 
 at java.lang.System.loadLibrary(System.java:989)`

我知道这个问题可以修复'通过在我的项目中创建一个x86文件夹并将libLibraryA.so复制到其中。有谁知道gradle是否可以/应该为我处理这个?将arm编译库放入x86文件夹以便在intel设备上使用是否安全,还是会破坏运行时转换?我在Nexus播放器上看到了无法读取我们的arm编译库的问题。

1 个答案:

答案 0 :(得分:2)

如果它们不相互依赖(即,如果它们不通过Java而不直接相互调用),则可以混合为x86编译的库和仅用于arm的库。

因此,gradle不会混合使用针对不同体系结构的库,实际上您有责任这样做,最简单的方法就是将libLibraryA.so复制到x86文件夹。

但这样做是一种解决方法,它只适用于基于Intel的零售设备。我不建议这样做:正确的做法仍然是为x86编译libLibraryA.so版本并将其放入x86文件夹中。

更新:正如我在下面的评论中所述,Android 5.0不再支持从应用程序的x86文件夹加载arm lib。