Android UnsatisfiedLinkError with OpenCV 2.4.2

半城伤御伤魂 提交于 2019-11-28 06:57:32

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.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!