2

我正在尝试让我的 64 位 Android 设备编译本地 32 位 jniLibs,到目前为止一切正常,但我遇到了障碍。

几天来,我一直在研究到底出了什么问题,到处乱逛,但这是我得到的当前错误:

java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app/org.opencv.engine-1/lib/arm64/libopencv_java3.so" 是 64 位而不是 32 位

考虑到 64 位设备认识到它应该编译 32 位架构,这实际上是有希望的,这是我通过省略 arm64、x86_64 和 mips64 实现的,根据这个答案: Android JNI: 32-bit compatability with 64-位设备?

我使用的初始化代码是:

 OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);

所以我的问题如下:

  1. 是否有某种方法可以编辑 OpenCV 3.0 中包含的 Abi,以识别我只希望在设备识别它应该只搜索 32 位框架之后加载 32 位框架?

  2. 恢复到 OpenCV 2.4.11 后功能丢失会更糟吗(我知道本机相机在新框架上无法正常工作)

  3. 如果 Abi 的答案是正确的,它将对应于应用程序级别、项目级别或其他(可能是 opencvlib)级别的​​ gradle 构建吗?那部分在我的脑海中浮现,阅读了另一个答案。

4

1 回答 1

0

我通过删除所有 64 位库并将所有 32 位库保留在 app -> src -> main 下的 jniLibs 文件夹中来正确安装它,但我没有调用 OpenCVLoader 来加载库,而是进行了如下调用:

   if (!OpenCVLoader.initDebug()) {
        Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, mLoaderCallback);
    } 
    else {
        Log.d(TAG, "OpenCV library found inside package. Using it!");
        mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
    }

它会检测您的应用程序是否已经在本地包含 OpenCVManager 否则会处理的文件。将这些文件包含在 jniLibs 文件夹中的另一个优点是不再出现下载 OpenCVManager 的提示,并且您的应用程序仍然具有用户拥有的功能。

我想在本地实现所有内容的快速指南是:

  1. 文件 -> 新建 -> 导入模块 -> 导航到 OpenCV 3.1 -> sdk -> java

  2. 编辑新 OpenCV 模块的 build.gradle 以匹配应用程序的 build.gradle

  3. 右键单击项目的应用程序文件夹 -> 打开模块设置 -> 依赖项 -> + -> 模块依赖项 -> 选择您导入的 OpenCV 版本

  4. 在 app -> src -> main 下创建一个名为 jniLibs 的文件夹(默认情况下会调用它,但可以通过 build.gradle 文件进行编辑)

  5. 导航到您的 OpenCV 目录 -> sdk -> 本机 -> libs -> 复制并粘贴 armeabi、armeabi-v7a、mips 到您新创建的 jniLibs 文件夹

  6. 然后使用上面的代码示例进行初始化,OpenCV 应该在本地加载。

于 2016-01-05T18:29:30.093 回答