findLibrary 在 Android Studio 中使用 OpenCV4Android 返回 null

findLibrary returned null with OpenCV4Android in Android Studio

我想将 OpenCV 用于我目前正在开发的 Android 应用程序,用 Java 编写。

为了设置 OpenCV,我完全按照 this page as well as on this one 中解释的步骤进行操作(尝试了两种解决方案均未成功)。当我让我的项目重建时它工作,但是当我让我的代码运行,它在尝试执行以下操作时失败:

fdetector = FeatureDetector.create(FeatureDetector.SURF);

我得到的错误是 java.lang.UnsatisfiedLinkError: Native method not found: org.opencv.features2d.FeatureDetector.create_0:(I)J,有点像 the aforementioned question page。我尝试了此页面上提出的所有解决方案,但 none 对我有用。

我确实安装了 JNI,所以我想这不是问题所在。或米 我的设置如下:

-app
    |-libs (with my other app libraries, including javacv.jar)
    |-src
         |-main
               |-java (with my code)
               |-res
               |-jniLibs (with the .so files from the OpenCV's sdk\native\libs\x86)
         |-build.gradle
-libs
     |-opencv
             |-build
             |-jniLibs (with the same .so files as I was not sure where to put them)
             |-res
             |-src
             |-build.gradle

我的应用 build.gradle 包含以下依赖项:

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile fileTree(dir: 'libs', include: ['*.java'])
compile fileTree(dir: 'libs', include: ['*.so'])
compile 'com.android.support:appcompat-v7:21.0.2'
compile project(':libs:opencv')
}

并且 opencv 的 build.gradle 包含以下 sourceSets:

sourceSets {
main {
  manifest.srcFile 'AndroidManifest.xml'
  java.srcDirs = ['src']
  resources.srcDirs = ['src']
  res.srcDirs = ['res']
  aidl.srcDirs = ['src']
  jniLibs.srcDirs = ['jniLibs']
}
}

我的 settings.gradle 包含一个 include ':libs:opencv'

我真的看不出哪里做错了,谁能帮我解决这个问题?

您是否在 JAVA static statement 中加载 OpenCV 库?如果没有,请将其放在 activity:

的某处
static { 
   System.loadLibrary("opencv_java"); //the name of the .so file, without the 'lib' prefix
}

您需要对 local.properties 文件和 Build.gradle 进行一些更改,以在 Android 工作室中包含 NDK 支持。这是一个视频,详细展示了如何在 Android Studio 上构建 NDK 应用程序 https://www.youtube.com/watch?v=0fEtrekNcOo

在 Android Studio 中使用 Android OpenCV SDK 的以下步骤。

  1. 从[OpenCV.org][1]下载 Android 的最新 OpenCV SDK 并解压 zip 文件。
  2. 将 OpenCV 导入 Android Studio,从 文件 -> 导入模块,选择 sdk/java 解压缩的 opencv 存档中的文件夹。
  3. 在导入的 OpenCV 模块下更新 build.gradle 以更新 4 个字段以匹配您的项目 build.gradle a) compileSdkVersion b) buildToolsVersion c) minSdkVersion 和 4) targetSdk版本。
  4. 通过Application -> Module Settings添加模块依赖,select Dependencies 选项卡。点击底部的+图标,选择Module Dependency和select导入的OpenCV模块。
  5. 复制libs文件夹下的sdk/native到Android app/src/main 下的工作室。
  6. 在 Android Studio 中,将复制的 libs 目录重命名为 jniLibs我们完成了。

第 (6) 步是因为 Android 工作室希望 app/src/main/jniLibs 中的原生库而不是旧的 libs 文件夹中。对于 Android OpenCV 的新手,不要错过以下步骤

  • 包括static{ System.loadLibrary("opencv_java"); }
  • 对于步骤 (5),如果您忽略任何平台库,例如 x86,请确保您的 device/emulator 不在该平台上。

谢谢大家的帮助,我已经整理好了!

实际上我所做的是按照 https://www.youtube.com/watch?v=0fEtrekNcOo 的 G3M 视频中的说明将 ndk 功能添加到我的项目中,即将以下行添加到我的应用程序的 local.properties:

ndk.dir=D\:\AndroidSDK\ndk

然后,按照 Kiran 的建议,我完成了 this setup instruction

中的步骤

最后,我能够进行 bonnyz 建议的静态调用以获取 "opencv_java" 库:

static { 
    System.loadLibrary("opencv_java"); //the name of the .so file, without the 'lib' prefix
}

经过长时间的研究,我用下面给出的代码修复了它:

sourceSets.main {
    jni.srcDirs = []
    jniLibs.srcDir 'src/main/libs'
}