Android UnsatisfiedLinkError with OpenCV 2.4.2

just trying to do a simple openCV android program. Downloaded and installed OpenCV for Android following the instructions here and added the OpenCV Library 2.4.2 as a library project for my own android project like the instructions state.

However when I compile the standard “Hello World Program”, as follows,
it fails if I include the Mat mat = new Mat(); line, but succeeds otherwise.

  • Android facebook sdk does not call callback after login
  • What's the Android ADB shell “dumpsys” tool and what are its benefits?
  • Open Chromecast YouTube video from my Android app
  • MultiChoiceMode before API 11
  • Intent for selecting wallpaper with wallpaper region highlighting
  • android linearlayout background selector
  • package com.example;
    
    import org.opencv.core.Mat;
    
    import android.app.Activity;
    import android.os.Bundle;
    
    public class HelloAndroidActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            Mat mat = new Mat();
        }
    }
    

    Here’s the stack trace it prints out:

        07-23 09:59:43.835: E/AndroidRuntime(8222): FATAL EXCEPTION: main
    07-23 09:59:43.835: E/AndroidRuntime(8222): java.lang.UnsatisfiedLinkError: n_Mat
    07-23 09:59:43.835: E/AndroidRuntime(8222):     at org.opencv.core.Mat.n_Mat(Native Method)
    07-23 09:59:43.835: E/AndroidRuntime(8222):     at org.opencv.core.Mat.<init>(Mat.java:181)
    07-23 09:59:43.835: E/AndroidRuntime(8222):     at com.example.HelloAndroidActivity.onCreate(HelloAndroidActivity.java:15)
    07-23 09:59:43.835: E/AndroidRuntime(8222):     at android.app.Activity.performCreate(Activity.java:4538)
    07-23 09:59:43.835: E/AndroidRuntime(8222):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071)
    07-23 09:59:43.835: E/AndroidRuntime(8222):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2161)
    07-23 09:59:43.835: E/AndroidRuntime(8222):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2240)
    07-23 09:59:43.835: E/AndroidRuntime(8222):     at android.app.ActivityThread.access$600(ActivityThread.java:139)
    07-23 09:59:43.835: E/AndroidRuntime(8222):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262)
    07-23 09:59:43.835: E/AndroidRuntime(8222):     at android.os.Handler.dispatchMessage(Handler.java:99)
    07-23 09:59:43.835: E/AndroidRuntime(8222):     at android.os.Looper.loop(Looper.java:154)
    07-23 09:59:43.835: E/AndroidRuntime(8222):     at android.app.ActivityThread.main(ActivityThread.java:4977)
    07-23 09:59:43.835: E/AndroidRuntime(8222):     at java.lang.reflect.Method.invokeNative(Native Method)
    07-23 09:59:43.835: E/AndroidRuntime(8222):     at java.lang.reflect.Method.invoke(Method.java:511)
    07-23 09:59:43.835: E/AndroidRuntime(8222):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    07-23 09:59:43.835: E/AndroidRuntime(8222):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    07-23 09:59:43.835: E/AndroidRuntime(8222):     at dalvik.system.NativeStart.main(Native Method)
    

    Two things to note: I am not directly using anything native in this code (like some other questions on here) and the old OpenCV 2.3.x library worked just fine before using the same method. Both Android projects have the same target and supported API settings.

    Related posts:

    log4j support in Android
    ADB - VirtualBox connection
    How do you troubleshoot an Android system library crash (libwebcore.so)
    Execution failed for task &#039;:app:transformClassesWithDexForDebug&#039; while implementin...
    fail to start android emulator after update sdk to 23.0.5
    Android, how to clear the recent task list which could get from Home button in most phone? Reflectio...
  • Class not found when unmarshalling when passing Parcelable through Messenger to remote service
  • Weakreference get() method how safe is it? (Android, asynctask)
  • call getString(R.strings…) from class?
  • How can you listen to click events on a ListView that occur outside of the list items?
  • Using ItemizedOverlay and OverlayItem In Android Beta 0.9
  • How can you implement multi-selection and Contextual ActionMode in ActionBarSherlock?
  • 3 Solutions collect form web for “Android UnsatisfiedLinkError with OpenCV 2.4.2”

    Figured it out. Wasn’t statically linking the library. If you use this code instead, it works.

    package com.example;
    
    import org.opencv.android.BaseLoaderCallback;
    import org.opencv.android.LoaderCallbackInterface;
    import org.opencv.android.OpenCVLoader;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    
    public class HelloAndroidActivity extends Activity
    {
    
        final String TAG = "Hello World";
    
    private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
       switch (status) {
           case LoaderCallbackInterface.SUCCESS:
           {
          Log.i(TAG, "OpenCV loaded successfully");
          // Create and set View
          setContentView(R.layout.main);
           } break;
           default:
           {
          super.onManagerConnected(status);
           } break;
       }
        }
    };
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        Log.i(TAG, "onCreate");
        super.onCreate(savedInstanceState);
    
        Log.i(TAG, "Trying to load OpenCV library");
        if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mOpenCVCallBack))
        {
          Log.e(TAG, "Cannot connect to OpenCV Manager");
        }
    }
    }
    

    However, not too fond of this “OpenCV Manager” idea. Makes it so the user has to install several packages manually before the app will work.

    The solution is to either do like in @Jason answer which is about using the OpenCV Manager. It is also explained in great detail on the official documentation here.

    But like @Jason says, “Makes it so the user has to install severally packages manually before the app will work”. Although this is true, OpenCV Manager has some advantages like for example:

    • If OpenCV is updated, the user only needs to update the manager/library. The applications which use the manager can remain the same.

    • Your app apk size will be a lot smaller:

      • A simple opencv app will be about ~400KB for each app + ~800KB for OpenCV Manager + ~12MB for the OpenCV library compiled for your device architecture.
      • With the traditional static linking every single opencv app in your device would be at least ~25MB.
      • These sizes depend, off course, on the amount of stuff you place inside your app …

    Even so, if you wish to deploy your apps the traditional way, static linking, you can read the instructions here.

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

    You can statically load the open cv library everywhere in your activity.
    Search the .so file in your jniLibs folder and copy/paste it as argument of “loadLibrary” method without the lib prefix.

    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.