我在Android Studio中制作了一个使用两个库的应用程序。一个带有Android包装器和jar库的本机库。 出于某种原因,如果将其他jar库编译到项目中,则不会加载本机库。因此,如果我只使用本机库运行应用程序,一切正常。我将另一个jar库添加到我的gradle文件并繁荣......一个UnsatisfiedLinkError:
java.lang.UnsatisfiedLinkError: Couldn't load MobileOcrEngine from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.app-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.app-1, /vendor/lib, /system/lib]]]: findLibrary returned null
我使用此应用程序时运行正常:
dependencies {
compile fileTree(include: ['*.jar'], dir: 'src/main/jniLibs')
compile 'com.android.support:support-v13:21.0.2'
compile project(':wheel')
}
我尝试时发生错误:
dependencies {
compile fileTree(include: ['*.jar'], dir: 'src/main/jniLibs')
compile 'com.android.support:support-v13:21.0.2'
compile project(':wheel')
compile files('libs/realm-0.78.0.jar')
}
或当我尝试使用相同的库但使用Maven存储库时:
dependencies {
compile fileTree(include: ['*.jar'], dir: 'src/main/jniLibs')
compile 'com.android.support:support-v13:21.0.2'
compile project(':wheel')
compile 'io.realm:realm-android:0.78.0'
}
或者如果我尝试将jar放在jniLibs文件夹中:
dependencies {
compile fileTree(include: ['*.jar'], dir: 'src/main/jniLibs')
compile 'com.android.support:support-v13:21.0.2'
compile project(':wheel')
}
我不知道问题的根源在哪里。有两个库中的一个,Android Studio还是我做错了什么?
注意: 我知道StackOverflow上有很多关于UnsatisfiedLinkErrors的问题,但这些都没有为我的问题提供解决方案。如果它是我使用的唯一库,我加载本机库没有问题...
答案 0 :(得分:17)
我发现了问题。我想要添加的另一个jar在内部使用C ++库,支持armeabi
,armeabi-v7a
,x86
和mips
。我一直使用的本机库仅支持armeabi
。
我用于测试的设备是armeabi-v7a设备。所有这些当我使用本机库时,设备在我的libs目录的armeabi-v7a中检查了库。如果它无法在那里找到它,它将尝试armeabi目录。
当我加载另一个支持4种不同体系结构的jar时,设备会加载armeabi-v7a库。当它发现jar的armeabi-v7a库时,它将尝试为同一架构加载本机库。如果找不到库,则不会将armeabi目录检查为备份,因此findLibrary
返回null,因此UnsatisfiedLinkError
。
我通过为armeabi架构创建一个目录并将armeabi-v7a目录的.so-library复制到其中来解决它。
答案 1 :(得分:0)
defaultConfig {
...
ndk {
abiFilters "armeabi-v7a", "x86", "armeabi", "mips"
}
}