Android上的OpenCV:Canned';t从loader加载opencv_java-我必须用NDK编译吗?我错过什么了吗?

Android上的OpenCV:Canned';t从loader加载opencv_java-我必须用NDK编译吗?我错过什么了吗?,android,opencv,android-ndk,Android,Opencv,Android Ndk,我觉得我错过了一些明显的东西。我正在尝试让OpenCV在Android上运行。我想使用静态初始化方法,因此我将适当的本机库文件从OpenCV SDK复制到我的Android Studio项目中的app/libs/armeabi-v7a文件夹中。我知道GoogleGlass(我为之开发的)使用了这种架构——而且在任何情况下,我也有/lib/armeabi文件夹以防万一 我在StackOverflow上搜索过这里,当然answers.opencv.org已经关闭了。我找到的答案并没有解决问题。据我所

我觉得我错过了一些明显的东西。我正在尝试让OpenCV在Android上运行。我想使用静态初始化方法,因此我将适当的本机库文件从OpenCV SDK复制到我的Android Studio项目中的app/libs/armeabi-v7a文件夹中。我知道GoogleGlass(我为之开发的)使用了这种架构——而且在任何情况下,我也有/lib/armeabi文件夹以防万一

我在StackOverflow上搜索过这里,当然answers.opencv.org已经关闭了。我找到的答案并没有解决问题。据我所知,我:

  • 为Android安装NDK
  • 下载并解压缩OpenCV SDK
  • 将其作为Android库导入,并作为模块依赖项添加
  • 将库文件复制到/libs/armeabi-v7a(在我的Android Studio项目中)
  • 使用以下代码,库应正确加载:

    if (!OpenCVLoader.initDebug()) {
       Log.e("OpenCV","Unable to load OpenCV");
    } else {
        Log.e("OpenCV","OpenCV has loaded!");
    }
    
但是,我得到了这个错误:

12-16 08:46:08.047    1838-1838/com.company.opencvsdktest D/OpenCV/StaticHelper﹕ Trying to get library list
12-16 08:46:08.047    1838-1838/com.company.opencvsdktest E/OpenCV/StaticHelper﹕ OpenCV error: Cannot load info library for OpenCV
12-16 08:46:08.047    1838-1838/com.company.opencvsdktest D/OpenCV/StaticHelper﹕ Library list: ""
12-16 08:46:08.047    1838-1838/com.company.opencvsdktest D/OpenCV/StaticHelper﹕ First attempt to load libs
12-16 08:46:08.047    1838-1838/com.company.opencvsdktest D/OpenCV/StaticHelper﹕ Trying to init OpenCV libs
12-16 08:46:08.047    1838-1838/com.company.opencvsdktest D/OpenCV/StaticHelper﹕ Trying to load library opencv_java
12-16 08:46:08.047    1838-1838/com.company.opencvsdktest D/OpenCV/StaticHelper﹕ Cannot load library "opencv_java"
12-16 08:46:08.047    1838-1838/com.company.opencvsdktest W/System.err﹕ java.lang.UnsatisfiedLinkError: Couldn't load opencv_java from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.company.opencvsdktest-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.company.opencvsdktest-1, /vendor/lib, /system/lib]]]: findLibrary returned null
12-16 08:46:08.055    1838-1838/com.company.opencvsdktest W/System.err﹕ at java.lang.Runtime.loadLibrary(Runtime.java:358)
12-16 08:46:08.055    1838-1838/com.company.opencvsdktest W/System.err﹕ at java.lang.System.loadLibrary(System.java:529)
12-16 08:46:08.055    1838-1838/com.company.opencvsdktest W/System.err﹕ at org.opencv.android.StaticHelper.loadLibrary(StaticHelper.java:64)
12-16 08:46:08.055    1838-1838/com.company.opencvsdktest W/System.err﹕ at org.opencv.android.StaticHelper.initOpenCVLibs(StaticHelper.java:95)
12-16 08:46:08.055    1838-1838/com.company.opencvsdktest W/System.err﹕ at org.opencv.android.StaticHelper.initOpenCV(StaticHelper.java:39)
12-16 08:46:08.055    1838-1838/com.company.opencvsdktest W/System.err﹕ at org.opencv.android.OpenCVLoader.initDebug(OpenCVLoader.java:62)
12-16 08:46:08.055    1838-1838/com.company.opencvsdktest W/System.err﹕ at com.company.opencvsdktest.MainActivity.onResume(MainActivity.java:93)
12-16 08:46:08.055    1838-1838/com.company.opencvsdktest W/System.err﹕ at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1194)
12-16 08:46:08.055    1838-1838/com.company.opencvsdktest W/System.err﹕ at android.app.Activity.performResume(Activity.java:5315)
12-16 08:46:08.055    1838-1838/com.company.opencvsdktest W/System.err﹕ at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2804)
12-16 08:46:08.055    1838-1838/com.company.opencvsdktest W/System.err﹕ at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2843)
12-16 08:46:08.055    1838-1838/com.company.opencvsdktest W/System.err﹕ at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2278)
12-16 08:46:08.055    1838-1838/com.company.opencvsdktest W/System.err﹕ at android.app.ActivityThread.access$800(ActivityThread.java:138)
12-16 08:46:08.055    1838-1838/com.company.opencvsdktest W/System.err﹕ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:    1236)
12-16 08:46:08.063    1838-1838/com.company.opencvsdktest W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:102)
12-16 08:46:08.063    1838-1838/com.company.opencvsdktest W/System.err﹕ at android.os.Looper.loop(Looper.java:149)
12-16 08:46:08.063    1838-1838/com.company.opencvsdktest W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5045)
12-16 08:46:08.063    1838-1838/com.company.opencvsdktest W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
12-16 08:46:08.063    1838-1838/com.company.opencvsdktest W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:515)
12-16 08:46:08.063    1838-1838/com.company.opencvsdktest W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
12-16 08:46:08.063    1838-1838/com.company.opencvsdktest W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
12-16 08:46:08.063    1838-1838/com.company.opencvsdktest W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
12-16 08:46:08.063    1838-1838/com.company.opencvsdktest D/OpenCV/StaticHelper﹕ First attempt to load libs fails
12-16 08:46:08.063    1838-1838/com.company.opencvsdktest E/OpenCV﹕ Unable to load OpenCV
12-16 08:46:08.211    1838-1838/com.company.opencvsdktest D/OpenGLRenderer﹕ Enabling debug mode 0
我需要对SDK做些额外的事情吗?我需要先编译什么吗?还是应该自动工作?如果我安装了NDK,除了这里提到的步骤之外,我不需要做任何事情:对吗

编辑:我还尝试了libs文件夹的不同位置,例如在项目根目录和openCVLibrary文件夹中。两者都不起作用


编辑2:使用Manager APK可以正常工作。但对于玻璃,这并不是一个真正的解决方案,因为没有办法进入游戏商店

使用Android Studio和gradle,默认情况下,您必须将.so文件放在
/jniLibs/CPU\u ARCH
中,而不是放在
/libs/CPU\u ARCH


然后,您可以检查您的库是否正确地集成到apk中:将其作为.zip文件打开,查看/lib/CPU\u ARCH文件夹中是否有库。

要解决您的问题,请尝试以下步骤:

  • 查看应用程序.mk并检查应用程序ABI的配置是否正确。OpenCV示例使用armeabi-v7a作为默认目标cpu架构。但就我而言,我的应用程序是针对arm64-v8a设备部署的。因此,有必要尝试:

    APP\u ABI:=all

    。。。为了确保jni LIB也将为您的设备构建

  • build.gradle文件中将“libs”文件夹设置为新的jniLibs(用于jni*.so的库)

  • _


    我遇到了同样的问题,我通过将
    sdk/native/libs
    文件夹重新压缩到我的projects-libs文件夹中解决了这个问题。我发现使用git时,只有文件mods从:100755更改为100644

    建议:如果你从头开始,严格遵循这些步骤,应该很容易。NDK和apk经理将不再需要。APP_ALI:=所有都是为我修复的,非常感谢!
     sourceSets{
             main {
                 jni.srcDirs =[]
                 jniLibs.srcDirs = ['src/main/libs'] # to change to your project structure
             }
        }