1

I feel like I've missed something obvious here. I'm trying to get OpenCV to run on Android. I wanted to use the static initialization method, so I copied the appropriate native library files from the OpenCV SDK to my app/libs/armeabi-v7a folder within my Android Studio project. I know that Google Glass (what I'm developing for) uses this architecture - and in any case, I also have the /lib/armeabi folder just in case.

I searched here on StackOverflow, and of course answers.opencv.org is down. The answers I found didn't solve the problem. As far as I understand it, I:

  • Install NDK for Android
  • Download and extract the OpenCV SDK
  • Import it as an Android library and add it as a module dependency
  • Copy the library files to /libs/armeabi-v7a (within my Android Studio project)
  • Use the following code and the library should load correctly:

    if (!OpenCVLoader.initDebug()) {
       Log.e("OpenCV","Unable to load OpenCV");
    } else {
        Log.e("OpenCV","OpenCV has loaded!");
    }
    

However, I get this error:

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

Do I have to do anything extra with the SDK? Did I need to compile anything first? Or should it just work automatically? Provided I have the NDK installed, I shouldn't have to do anything other than the steps mentioned here: http://docs.opencv.org/doc/tutorials/introduction/android_binary_package/dev_with_OCV_on_Android.html#application-development-with-static-initialization right?

EDIT: I also tried different locations for the libs folder, such as in the project root directory and in the openCVLibrary folder. Neither worked.

EDIT 2: Using the Manager APK works fine. But with Glass, this won't really be a solution as there's no way to access the play store!

jgads
  • 257
  • 1
  • 3
  • 13
  • suggestion: if you start from a clean slate and follow these steps *exactly*, it should easy. http://stackoverflow.com/a/27421494/1180117. NDK and Manager apk won't be needed. – kiranpradeep Dec 16 '14 at 15:44

4 Answers4

3

To solve your problem let try the following steps:

  1. Take a look in Application.mk and check if the APP_ABI is right configured. OpenCV samples use armeabi-v7a as default target cpu architecture. But in my case, my app was deployed against an arm64-v8a device. It's therefore to try:

    APP_ABI := all

    ... to be sure the jni-libs will also be built for your device.

  2. Set up 'libs' folder as the new jniLibs (library for jni *.so) in build.gradle file

_

 sourceSets{
         main {
             jni.srcDirs =[]
             jniLibs.srcDirs = ['src/main/libs'] # to change to your project structure
         }
    }
Tim Long
  • 2,039
  • 1
  • 22
  • 25
0

With Android Studio and gradle, by default, you have to place your .so files inside /jniLibs/CPU_ARCH instead of inside /libs/CPU_ARCH.

Then, you can check if your libs are properly getting integrated inside your apk: open it as a .zip file, and look into /lib/CPU_ARCH folders to see if your libraries are there.

ph0b
  • 14,353
  • 4
  • 43
  • 41
0

I had the same problem and I solved it by recopying the sdk/native/libs folder into my projects libs folder. I discovered with git that only the file mods changed from: 100755 to 100644

Raimund Wege
  • 441
  • 4
  • 19
0

try to download older version from Opencv SDK from here 3.4.1 would work then copy this files from sdk/native/libs to your jniLibs file it worked for me

Mark S. Khalil
  • 113
  • 1
  • 4
  • This does not provide an answer to the question. Once you have sufficient [reputation](https://stackoverflow.com/help/whats-reputation) you will be able to [comment on any post](https://stackoverflow.com/help/privileges/comment); instead, [provide answers that don't require clarification from the asker](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can-i-do-instead). – Vatsal Dholakiya Aug 31 '21 at 13:33