UnsatisfiedLinkError: n_Mat mientras se usa opencv2.4.3 con android 4.0

Estoy usando opencv en android. Pero cuando estoy agregando Mat () en mi código mi aplicación se detiene inesperadamente después del lanzamiento. Mi registro de error es como abajo:

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)` 

Mi código es

 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); } } 

}

He intentado otras soluciones que se proporcionan en stackoverflow pero ninguno de ellos funcionó para mí. Ya he copiado libopencv_java.so y libopencv_info.so en mi carpeta / libs de F: \ OpenCV-2.4.3.2-android-sdk \ sdk \ nativo \ libs \ armeabi-v7a pero este error sigue siendo el mismo.

por favor ayuda.

gracias por adelantado 🙂

Su bueno que alguien me incitó a publicar mi respuesta elaboradamente. Así que aquí estoy publicando la solución de mi pregunta:

 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); } 

El problema detrás de este error es que estamos llamando opencv función dependiente (por ejemplo: Mat ()) antes de la inicialización opencv por lo que su error de mostrar. Así que puedes solucionarlo si pones tu función opencv en onManagerConnected () así:

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

Aquí, startDisplay () contiene mi Mat () inicialización. El problema es que cuando se inicia una aplicación, entonces la función oncreate () se ejecuta primero y después de que se carga opencv, así que si pones tu función opencv en oncreate () entonces mostrará error como opencv todavía no está cargado.

Espero que esto solucione su problema. Lo mejor de la suerte … Stackoverflow Rocks !!! 🙂

  • Error: no se puede encontrar la variable de símbolo GL_TEXTURE_EXTERNAL_OES + OpenCV en Android Studio
  • Visión por computadora y bibliotecas AR disponibles para Android?
  • Cómo unir png con alpha / transparencia en un marco en tiempo real
  • Android Paper Detection con OpenCV
  • Cuenca en Opencv Android
  • Cómo cambiar el tamaño de una imagen a la imagen de alta resolución sin perder píxeles?
  • Android Detección de la cara con OpenCV / JavaCV
  • ¿Cómo traducir código OpenCV-C ++, que contiene punteros, a JAVA?
  • Cómo obtener MJPG stream video de android IPWebcam using opencv
  • Uso no libre (SIFT, SURF) en android con java
  • OpenCV: Optimización del cálculo del flujo óptico
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.