Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android强制OpenCV 3.0作为32位库加载_Android_Java Native Interface_Opencv3.0_Qandroidjniobject - Fatal编程技术网

Android强制OpenCV 3.0作为32位库加载

Android强制OpenCV 3.0作为32位库加载,android,java-native-interface,opencv3.0,qandroidjniobject,Android,Java Native Interface,Opencv3.0,Qandroidjniobject,我正试图让我的64位Android设备编译本地32位jniLibs,到目前为止还可以,但我有点遇到了障碍 几天来,我一直在研究到底哪里出了问题,四处游荡,但这是我目前遇到的错误: java.lang.unsatifiedlinkerror:dlopen失败:“/data/app/org.opencv.engine-1/lib/arm64/libopencv_java3.so”是64位而不是32位 考虑到64位设备认识到它应该编译32位体系结构,这实际上是有希望的,我通过省略arm64、x86_6

我正试图让我的64位Android设备编译本地32位jniLibs,到目前为止还可以,但我有点遇到了障碍

几天来,我一直在研究到底哪里出了问题,四处游荡,但这是我目前遇到的错误:

java.lang.unsatifiedlinkerror:dlopen失败:“/data/app/org.opencv.engine-1/lib/arm64/libopencv_java3.so”是64位而不是32位

考虑到64位设备认识到它应该编译32位体系结构,这实际上是有希望的,我通过省略arm64、x86_64和mips64实现了这一点,根据以下回答:

我使用的初始化代码是:

 OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
因此,我的问题如下:

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

  • 如果恢复到OpenCV 2.4.11,功能损失会更严重吗(我知道本机摄像头在新框架上无法正常工作)

  • 如果Abi的答案是正确的,它将对应于应用程序级、项目级或其他(可能是opencvlib)级的gradle构建吗?读到另一个答案时,这一部分让我不知所措


  • 通过删除所有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的提示,并且您的应用程序仍然具有用户拥有的功能

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

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

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

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

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

  • 导航到OpenCV目录->sdk->本机->libs->将armeabi、armeabi-v7a、mips复制并粘贴到新创建的JNILBS文件夹中

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


  • 我相信这只是将本机OpenCV与私有JNI库一起使用时可以预加载的原因之一。我可以在包含64位armeabi-v8a/arm64时正确加载它,但我想使用的项目库都是32位的。我也使用Android Studio作为IDE,但没有太大不同:导入、生成build.gradle,包括jniLibs及其各自的子目录,在项目级别引用,并添加模块依赖项编辑:此外,在仔细检查之后,我还没有加载自定义库,仅包括(据我所知)32位opencv libsI不认为您可以在独立安装opencv管理器的情况下强制
    OpenCVLoader
    选择32位libs。也许我误解了OpenCVLoader的实际功能,应该在快速搜索找到OpenCVLoader.initDebug()后以不同的方式实例化所有内容将只浏览应用程序jni文件,但它似乎不太稳定,因为如果文件没有以某种方式全部包含,我会抛出大量异常…您如何知道哪些库是64位的?根据经验,很少有,但官方的repo内容可以处理64位体系结构。