JNI UnsatisfiedLinkError,不兼容2库:Card.io + OpenTok

时间:2015-11-17 11:41:12

标签: android java-native-interface

我使用了两个库:card.ioopentok

OpenTok提供了一个.jar文件和2个jniLibs:armeabi / libopentok.so和x86 / libopentok.so。 Card.io导入"编译' io.card:android-sdk:5.1.2'"

已编译,我在我的APK中获得此结构:

lib
  arm64-v8a
    libcardioDecider.so
    libcardioRecognizer_tegra2.so
    libcardioRecognizer.so
    libopencv_core.so
    libopencv_imgproc.so
  armeabi
    libcardioDecider.so
    libopentok.so
  armeabi-v7a
    libcardioDecider.so
    libcardioRecognizer_tegra2.so
    libcardioRecognizer.so
    libopencv_core.so
    libopencv_imgproc.so
  mips
    libcardioDecider.so
  x86
    libcardioDecider.so
    libcardioRecognizer_tegra2.so
    libcardioRecognizer.so
    libopencv_core.so
    libopencv_imgproc.so
    libopentok.so
  x86_64
    libcardioDecider.so
    libcardioRecognizer_tegra2.so
    libcardioRecognizer.so
    libopencv_core.so
    libopencv_imgproc.so

但我的应用程序崩溃(当我使用opentok时):

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[
[zip file "/data/app/com.mypackage.app-1/base.apk"],
nativeLibraryDirectories=[/data/app/com.mypackage.app-1/lib/arm, 
                          /data/app/com.mypackage.app-1/base.apk!/lib/armeabi-v7a, 
                          /vendor/lib, 
                          /system/lib]
]] couldn't find "libopentok.so"

该应用与card.io正常工作。

如果我删除card.io,我的APK lib现在是:

lib
  armeabi
    libopentok.so
  x86
    libopentok.so

OpenTok现在正常运作。

我的猜测是:因为应用程序找到了一个目录" armeabi-v7a",它希望每个.so文件都进入。但是对于" libopentok.so",它只适用于" armeabi"。

如何解决我的问题?我是否必须将我的.so文件复制到每个目录中?

1 个答案:

答案 0 :(得分:1)

大多数设备都是armeabi-v7a,并且通常是您用来测试的设备。 Android寻找二进制文件的方式是使用最合适的集合。 例如,它不能同时使用armeabi-v7aarmeabi中的库。

因此,这里发生的是:

  1. 系统检查它的主目录armeabi-v7a
  2. 有一些.so个文件,因此不会更深入搜索(例如armeabi)
  3. 遗憾的是armeabi-v7a目录中有一些缺少的库(libopentok.so)
  4. 如果您希望与设备兼容,则必须为任何支持的配置提供每个.so文件。

    编辑:我不是100%肯定,但armeabi版本可以与armeabi-v7a兼容。值得一试。