使用OpenCV2.4.3和Android 4.0时出现“UnsatisfiedLinkError: n_Mat”错误。

8

我在安卓上使用OpenCV。但是当我在代码中添加Mat()时,我的应用程序在启动后意外停止。以下是我的错误日志:

FATAL EXCEPTION: main
java.lang.UnsatisfiedLinkError: n_Mat
at org.opencv.core.Mat.n_Mat(Native Method)
at org.opencv.core.Mat.<init>(Mat.java:441)
at com.example.imagepro.MainActivity.onCreate(MainActivity.java:36)
at android.app.Activity.performCreate(Activity.java:4465)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
at android.app.ActivityThread.access$600(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)     
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)`

我的代码是

import java.io.File;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Mat;

import org.opencv.android.Utils;
import org.opencv.imgproc.Imgproc;

import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;

public class MainActivity extends Activity {

final String TAG = "Hello World";
Mat imgToProcess;

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.activity_main);
       } break;
       default:
       {
      super.onManagerConnected(status);
       } break;
   }
    }
};

@Override
protected 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_3, this, mOpenCVCallBack))
        {
          Log.e(TAG, "Cannot connect to OpenCV Manager");
        }
        else{ Log.i(TAG, "opencv successfully added"); }

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    String path = Environment.getExternalStorageDirectory()+ "/Koala.jpg"; // get image from sd card

     File imgFile = new File(path);

     View v = null;
          if(imgFile.exists())
 {
          Bitmap myBitmap = BitmapFactory.decodeFile(path);                 
         ImageView myImage = (ImageView) findViewById(R.id.imageView);
         myImage.setImageBitmap(myBitmap);
         Log.i(TAG, "opencv successfull 1");
         Mat imgToProcess = new Mat();
         Mat newmat = new Mat();

         Utils.bitmapToMat(myBitmap, imgToProcess); 
         Imgproc.cvtColor(imgToProcess, newmat, Imgproc.COLOR_RGB2GRAY); 
 Bitmap outImage = Bitmap.createBitmap(newmat.rows(),newmat.cols(),Bitmap.Config.ARGB_8888);
         Utils.matToBitmap(newmat, outImage);

         myImage.setImageBitmap(outImage); 

   }

 }

我尝试了stackoverflow上提供的其他解决方案,但它们都对我无效。我已经从F:\OpenCV-2.4.3.2-android-sdk\sdk\native\libs\armeabi-v7a复制了libopencv_java.so和libopencv_info.so到我的/libs文件夹中,但这个错误仍然存在。

请帮忙解决。

谢谢!


请查看这里的问题。我遇到了同样的问题,并将问题隔离到了这一行:Mat m = new Mat(); Mat m = null; 和 Mat m; 可以工作,但我不需要它们。无论如何,请尝试我给你的链接,它对我有用。 - Francis Xavier S. Antazo
谢谢您的回复...但我也尝试过了。我已经链接了OpenCV库并进行了初始化。但就在昨天,经过了很多调试之后,我解决了这个问题...问题是我在oncreate()中调用了我的OpenCV相关函数。但我将其从那里移除,并在setcontentview()之后的onmanagerconnected()中调用它,它开始工作了。我认为OpenCV库的初始化是在oncreate之后在onmanagerconnected()中进行的。我是这个领域的新手,所以不知道这一点。 - AnShU
@AnShU,你能发布你的答案并自己接受吗?我想看看你放置初始化代码的那段代码。 - Chintan Rathod
你好Chintan,我试图在这里添加我的代码,但是出现了一些问题...我稍后会尝试添加它。好的,代码与上面相同,但如果你理解了我的上面的回答,你可能不需要它。这个错误背后的问题是你在opencv初始化之前调用了你的opencv依赖函数(例如:Mat()),所以它显示错误。因此,如果你将你的opencv函数放在onManagerConnected()函数中的Log.i(TAG, "OpenCV loaded successfully")下面而不是放在onCreate()中,你就可以解决它。请尝试这样做,让我知道是否有帮助。 - AnShU
1个回答

13

很好,有人提醒我详细回答我的问题。所以,我在这里发布了我的解决方案:

private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) {
     @Override
     public void onManagerConnected(int status) {
       switch (status) {
           case LoaderCallbackInterface.SUCCESS:
           {
              Log.i(TAG, "OpenCV loaded successfully");
              startDisplay();

           } break;


           default:
           {
               super.onManagerConnected(status);
           } break;
         }
      }
 };

    @Override
    protected void onCreate(Bundle savedInstanceState) {


         super.onCreate(savedInstanceState);
         Log.i(TAG, "Trying to load OpenCV library");
         if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mOpenCVCallBack))
         {
           Log.e(TAG, "Cannot connect to OpenCV Manager");
         }
         else{ Log.i(TAG, "opencv successfull"); 
         System.out.println(java.lang.Runtime.getRuntime().maxMemory()); }
         setContentView(R.layout.frameview);
    }

这个错误背后的问题是我们在opencv初始化之前调用了依赖opencv的函数(例如:Mat()),因此会显示错误。所以,您可以像这样将opencv函数放在onManagerConnected()中来解决它:

Log.i(TAG, "OpenCV loaded successfully");
startDisplay();

这里,startDisplay() 包含了我的 Mat() 初始化。问题在于当我们启动应用程序时,oncreate() 函数会首先执行,然后才加载 opencv,因此如果您将 opencv 函数放在 oncreate() 中,则会显示错误,因为 opencv 尚未加载。

我希望这可以解决您的问题。祝你好运... Stackoverflow 真棒!!! :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接