Статическая инициализация OpenCV в приложении для Android

#java #android #opencv #javacv

#java #Android #opencv #javacv

Вопрос:

Хорошо, я понятия не имею, что здесь происходит, я прочитал много тем об этом случае и следил за обзорами, но, к сожалению, я понятия не имею.

Я уже прочитал документацию OpenCV о статической инициализации. Итак, я скопировал собственные библиотеки OpenCV в свою libs папку.

Затем я добавил эту строку в свой код:

 static {
    if (!OpenCVLoader.initDebug()) {
        // Handle initialization error
    }
}
  

и, наконец, я добавил эту строку:

  mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
  

внутри onCreate метода.

Теперь, когда я запускаю свое приложение, я получаю эти ошибки:

 07-05 10:34:44.926: E/AndroidRuntime(9548): FATAL EXCEPTION: main
07-05 10:34:44.926: E/AndroidRuntime(9548): Process: org.opencv.javacv.facerecognition, PID: 9548
07-05 10:34:44.926: E/AndroidRuntime(9548): java.lang.NoClassDefFoundError: java.lang.ClassNotFoundException: com.googlecode.javacv.cpp.opencv_calib3d
07-05 10:34:44.926: E/AndroidRuntime(9548):     at com.googlecode.javacpp.Loader.load(Loader.java:455)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at com.googlecode.javacv.cpp.opencv_contrib.<clinit>(opencv_contrib.java:104)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at org.opencv.javacv.facerecognition.PersonRecognizer.<init>(PersonRecognizer.java:42)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at org.opencv.javacv.facerecognition.FdActivity$1.onManagerConnected(FdActivity.java:153)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at org.opencv.javacv.facerecognition.FdActivity.onCreate(FdActivity.java:232)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at android.app.Activity.performCreate(Activity.java:5451)07-05 10:34:44.926: E/AndroidRuntime(9548):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2359)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2453)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at android.app.ActivityThread.access$900(ActivityThread.java:173)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at android.os.Handler.dispatchMessage(Handler.java:102)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at android.os.Looper.loop(Looper.java:136)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at android.app.ActivityThread.main(ActivityThread.java:5579)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at java.lang.reflect.Method.invokeNative(Native Method)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at java.lang.reflect.Method.invoke(Method.java:515)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at dalvik.system.NativeStart.main(Native Method)
07-05 10:34:44.926: E/AndroidRuntime(9548): Caused by: java.lang.ClassNotFoundException: com.googlecode.javacv.cpp.opencv_calib3d
07-05 10:34:44.926: E/AndroidRuntime(9548):     at java.lang.Class.classForName(Native Method)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at java.lang.Class.forName(Class.java:251)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at com.googlecode.javacpp.Loader.load(Loader.java:453)
07-05 10:34:44.926: E/AndroidRuntime(9548):     ... 18 more
07-05 10:34:44.926: E/AndroidRuntime(9548): Caused by: java.lang.NoClassDefFoundError: java.lang.ClassNotFoundException: com.googlecode.javacv.cpp.opencv_highgui
07-05 10:34:44.926: E/AndroidRuntime(9548):     at com.googlecode.javacpp.Loader.load(Loader.java:455)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at com.googlecode.javacv.cpp.opencv_calib3d.<clinit>(opencv_calib3d.java:94)
07-05 10:34:44.926: E/AndroidRuntime(9548):     ... 21 more
07-05 10:34:44.926: E/AndroidRuntime(9548): Caused by: java.lang.ClassNotFoundException: com.googlecode.javacv.cpp.opencv_highgui
07-05 10:34:44.926: E/AndroidRuntime(9548):     at java.lang.Class.classForName(Native Method)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at java.lang.Class.forName(Class.java:251)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at com.googlecode.javacpp.Loader.load(Loader.java:453)
07-05 10:34:44.926: E/AndroidRuntime(9548):     ... 22 more
07-05 10:34:44.926: E/AndroidRuntime(9548): Caused by: java.lang.NoClassDefFoundError: java.lang.ClassNotFoundException: com.googlecode.javacv.cpp.opencv_imgproc
07-05 10:34:44.926: E/AndroidRuntime(9548):     at com.googlecode.javacpp.Loader.load(Loader.java:455)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at com.googlecode.javacv.cpp.opencv_highgui.<clinit>(opencv_highgui.java:85)
07-05 10:34:44.926: E/AndroidRuntime(9548):     ... 25 more
07-05 10:34:44.926: E/AndroidRuntime(9548): Caused by: java.lang.ClassNotFoundException: com.googlecode.javacv.cpp.opencv_imgproc
07-05 10:34:44.926: E/AndroidRuntime(9548):     at java.lang.Class.classForName(Native Method)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at java.lang.Class.forName(Class.java:251)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at com.googlecode.javacpp.Loader.load(Loader.java:453)
07-05 10:34:44.926: E/AndroidRuntime(9548):     ... 26 more
07-05 10:34:44.926: E/AndroidRuntime(9548): Caused by: java.lang.NoClassDefFoundError: java.lang.ClassNotFoundException: com.googlecode.javacv.cpp.opencv_core
07-05 10:34:44.926: E/AndroidRuntime(9548):     at com.googlecode.javacpp.Loader.load(Loader.java:455)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at com.googlecode.javacv.cpp.opencv_imgproc.<clinit>(opencv_imgproc.java:97)
07-05 10:34:44.926: E/AndroidRuntime(9548):     ... 29 more
07-05 10:34:44.926: E/AndroidRuntime(9548): Caused by: java.lang.ClassNotFoundException: com.googlecode.javacv.cpp.opencv_core
07-05 10:34:44.926: E/AndroidRuntime(9548):     at java.lang.Class.classForName(Native Method)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at java.lang.Class.forName(Class.java:251)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at com.googlecode.javacpp.Loader.load(Loader.java:453)
07-05 10:34:44.926: E/AndroidRuntime(9548):     ... 30 more
07-05 10:34:44.926: E/AndroidRuntime(9548): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load jniopencv_core from loader dalvik.system.PathClassLoader[dexPath=/data/app/org.opencv.javacv.facerecognition-32.apk,libraryPath=/data/app-lib/org.opencv.javacv.facerecognition-32]: findLibrary returned null
07-05 10:34:44.926: E/AndroidRuntime(9548):     at java.lang.Runtime.loadLibrary(Runtime.java:358)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at java.lang.System.loadLibrary(System.java:526)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at com.googlecode.javacpp.Loader.loadLibrary(Loader.java:593)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at com.googlecode.javacpp.Loader.load(Loader.java:489)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at com.googlecode.javacpp.Loader.load(Loader.java:431)
07-05 10:34:44.926: E/AndroidRuntime(9548):     at com.googlecode.javacv.cpp.opencv_core.<clinit>(opencv_core.java:136)
07-05 10:34:44.926: E/AndroidRuntime(9548):     ... 33 more
07-05 10:34:44.926: E/AndroidRuntime(9548): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load tbb from loader dalvik.system.PathClassLoader[dexPath=/data/app/org.opencv.javacv.facerecognition-32.apk,library
  

У меня также есть javacpp.jar и javacv.jar в моей libs папке.

РЕДАКТИРОВАТЬ1 После того, как я поискал информацию об этой ошибке, я выяснил, что у меня должна быть openCV библиотека (не Android SDK, библиотека OpenCV для Windows) в моей системе, и у меня также должна быть ее bin папка внутри моей переменной окружения PATH . Это имеет смысл, поскольку javacv это необходимо для разрешения объектов.

Теперь у меня нет никаких ошибок при запуске моего приложения на моем устройстве, но мое приложение не запускается. Каждый раз, когда я открываю его, просто всплывает сообщение об ошибке с надписью Unfortunately your app has stopped!! . Я думаю, возможно, это из-за проблемы с версией несовместимости между openCV и JavaCV библиотеками. Правда ли это?

Комментарии:

1. он жалуется на com.googlecode.javacv.cpp.opencv_calib3d. это другой пакет, а не собственный Android sdk opencv. к сожалению, обе привязки полностью несовместимы, пересмотрите, если вам действительно нужен javacv.

2. @berak Я не понял твою точку зрения. Когда я проверил внутри библиотек целевой папки (например, armeabi-v7a), которая находится в моей папке libs, я могу найти, например, ‘libopencv_calib3d.a’. Но почему у меня возникли ошибки в этой ссылке, что я должен сделать, чтобы это сработало?

3. опять же, оболочки opencv, похоже, находят свои библиотеки (часть ‘static linking’ предназначена только для них), javacv — нет

4. @berak вы имеете в виду, что я должен установить javacv в свою ОС? Я подумал, что если я добавлю jar-файлы javacv в библиотеки, зависящие от моего проекта, все будет в порядке

5. по крайней мере, вам придется строго придерживаться того или иного api. если вы хотите статическое связывание на Android, вы привязаны к opencv, поскольку он не будет связываться с javacv (ваша первоначальная проблема)