Unable to link native library in OpenCV Android sample

android, android-ndk, opencv

Solution

Whoohoo!

Finally I found solution for this problem by myself!

I decided to debug line:

System.loadLibrary("native_sample");

To do this I downloaded android source code from Android-SDK and then attached source folder (/opt/android-sdk-linux/sources/android-15) to my project. After this I found that error was:

Cannot load library: link_image[1936]:    37 could not load needed library 'libopencv_java.so' for 'libhello-jni.so' (load_library[1091]: Library 'libopencv_java.so' not found)

And really this library is not in `lib` directory. I don't know why but `ndk-build` ignored it. So i decided to copy and load it manualy. For this I copied `libopencv_java.so` from `/opt/OpenCV-2.4.0/libs/armeabi-v7a` and also edited java code:

static {
    System.loadLibrary("opencv_java"); //load opencv_java lib
    System.loadLibrary("native_sample");
}

Actually similar problems are:

- Can not load Opencv libraries in necessitas

- Android OpenCV: cannot dlopen camera wrapper library

From second solution I found that I can load libraries using dlopen, but I haven't tried it yet.

So I will write simple bash-script that will do it (just copy) for myself.

Thanks to all.

Problem

I have OpenCV code (c++), which I want to use in Android. To do this I have to use Android NDK. I downloaded OpenCV package for Android development (ver. 2.4.0) and did all steps from that manual. Basic samples (Java API only) run without problems. Sample #3 (Tutorial 3 (Advanced) - Add Native OpenCV) builds from ndk-builder correctly. But always got exception when I'm trying to run/debug it on device from eclipse: ``` Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/opencv/samples/tutorial3/Sample3View; ``` In this line: ``` System.loadLibrary("native_sample"); ``` Here's full logcat log: ``` 05-31 23:41:45.976: W/ActivityThread(9708): Application org.opencv.samples.tutorial3 is waiting for the debugger on port 8100... 05-31 23:41:45.983: I/System.out(9708): Sending WAIT chunk 05-31 23:41:45.983: I/dalvikvm(9708): Debugger is active 05-31 23:41:46.179: I/System.out(9708): Debugger has connected 05-31 23:41:46.179: I/System.out(9708): waiting for debugger to settle... 05-31 23:41:46.382: I/System.out(9708): waiting for debugger to settle... 05-31 23:41:46.585: I/System.out(9708): waiting for debugger to settle... 05-31 23:41:46.788: I/System.out(9708): waiting for debugger to settle... 05-31 23:41:46.983: I/System.out(9708): waiting for debugger to settle... 05-31 23:41:47.186: I/System.out(9708): waiting for debugger to settle... 05-31 23:41:47.389: I/System.out(9708): waiting for debugger to settle... 05-31 23:41:47.585: I/System.out(9708): waiting for debugger to settle... 05-31 23:41:47.788: I/System.out(9708): debugger has settled (1463) 05-31 23:41:47.819: D/szipinf(9708): Initializing inflate state 05-31 23:41:47.866: I/Sample::Activity(9708): Instantiated new class org.opencv.samples.tutorial3.Sample3Native 05-31 23:41:48.909: D/dalvikvm(9708): threadid=1: still suspended after undo (sc=1 dc=1) 05-31 23:41:51.770: I/Sample::Activity(9708): onCreate 05-31 23:41:59.283: W/dalvikvm(9708): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/opencv/samples/tutorial3/Sample3View; 05-31 23:42:01.965: D/AndroidRuntime(9708): Shutting down VM 05-31 23:42:01.965: W/dalvikvm(9708): threadid=1: thread exiting with uncaught exception (group=0x40015560) 05-31 23:42:01.999: E/AndroidRuntime(9708): FATAL EXCEPTION: main 05-31 23:42:01.999: E/AndroidRuntime(9708): java.lang.ExceptionInInitializerError 05-31 23:42:01.999: E/AndroidRuntime(9708): at org.opencv.samples.tutorial3.Sample3Native.onCreate(Sample3Native.java:21) 05-31 23:42:01.999: E/AndroidRuntime(9708): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 05-31 23:42:01.999: E/AndroidRuntime(9708): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722) 05-31 23:42:01.999: E/AndroidRuntime(9708): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784) 05-31 23:42:01.999: E/AndroidRuntime(9708): at android.app.ActivityThread.access$1500(ActivityThread.java:123) 05-31 23:42:01.999: E/AndroidRuntime(9708): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939) 05-31 23:42:01.999: E/AndroidRuntime(9708): at android.os.Handler.dispatchMessage(Handler.java:99) 05-31 23:42:01.999: E/AndroidRuntime(9708): at android.os.Looper.loop(Looper.java:130) 05-31 23:42:01.999: E/AndroidRuntime(9708): at android.app.ActivityThread.main(ActivityThread.java:3835) 05-31 23:42:01.999: E/AndroidRuntime(9708): at java.lang.reflect.Method.invokeNative(Native Method) 05-31 23:42:01.999: E/AndroidRuntime(9708): at java.lang.reflect.Method.invoke(Method.java:507) 05-31 23:42:01.999: E/AndroidRuntime(9708): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864) 05-31 23:42:01.999: E/AndroidRuntime(9708): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622) 05-31 23:42:01.999: E/AndroidRuntime(9708): at dalvik.system.NativeStart.main(Native Method) 05-31 23:42:01.999: E/AndroidRuntime(9708): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load native_sample: findLibrary returned null 05-31 23:42:01.999: E/AndroidRuntime(9708): at java.lang.Runtime.loadLibrary(Runtime.java:429) 05-31 23:42:01.999: E/AndroidRuntime(9708): at java.lang.System.loadLibrary(System.java:554) 05-31 23:42:01.999: E/AndroidRuntime(9708): at org.opencv.samples.tutorial3.Sample3View.<clinit>(Sample3View.java:48) 05-31 23:42:01.999: E/AndroidRuntime(9708): ... 14 more ``` I find solutions for the same problem but none of them didn't help me: - Native OpenCV Samples for Android throws UnsatisfiedLinkError - java.lang.UnsatisfiedLinkError: Couldn't load opencv_java: findLibrary returned null - Major OpenCV-Android for Windows Installing and Running Issues (no answer) Also I have tested it on different devices and Android API versions. My system configuration: ``` astor@astor-K42Jv:~$ uname -a Linux astor-K42Jv 3.2.0-24-generic-pae #39-Ubuntu SMP Mon May 21 18:54:21 UTC 2012 i686 i686 i386 GNU/Linux ``` I've been tried to fix this problem for 4 nights (it's my free time :) ), but with no luck. I really need this for my thesis, so any help will be appreciated. Update: I have tested this sample on Windows 7 (64), but result is the same. It seems that this is OpenCV bug. Update: Build log: ``` astor@astor-K42Jv:/opt/eclipse-android/workspace/OpenCV-2.4.0-samples/tutorial-3-native$ ndk-build Install : libnative_camera_r2.2.0.so => libs/armeabi-v7a/libnative_camera_r2.2.0.so Install : libnative_camera_r2.3.3.so => libs/armeabi-v7a/libnative_camera_r2.3.3.so Install : libnative_camera_r3.0.1.so => libs/armeabi-v7a/libnative_camera_r3.0.1.so Install : libnative_camera_r4.0.0.so => libs/armeabi-v7a/libnative_camera_r4.0.0.so Install : libnative_camera_r4.0.3.so => libs/armeabi-v7a/libnative_camera_r4.0.3.so Install : libnative_sample.so => libs/armeabi-v7a/libnative_sample.so ```

Original source

Related problems