2013-02-04 1 views
8

J'utilise opencv dans android. mais quand j'ajoute Mat() dans mon code mon application s'arrête de manière inattendue après le lancement. mon journal d'erreur est comme ci-dessous:UnsatisfiedLinkError: n_Mat en utilisant opencv2.4.3 avec android 4.0

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

mon code est

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

    } 

} 

}

j'ai essayé d'autres solutions proposées sur stackoverflow, mais aucun d'entre eux travaillaient pour moi. J'ai déjà copié libopencv_java.so et libopencv_info.so dans mon dossier/libs à partir de F: \ OpenCV-2.4.3.2-android-sdk \ sdk \ natif \ libs \ armeabi-v7a mais cette erreur reste la même.

aidez s'il vous plaît.

merci à l'avance :)

+0

Vérifiez la question [ici] (http://stackoverflow.com/questions/11614227/android-unsatisfiedlinkerror-with-opencv-2-4-2). J'avais les mêmes problèmes et j'ai isolé le problème à la ligne: Mat m = new Mat(); Mat m = null; et Mat m; fonctionne mais je n'en ai pas besoin. Quoi qu'il en soit, essayez le [lien] (http://stackoverflow.com/questions/11614227/android-unsatisfiedlinkerror-with-opencv-2-4-2) Je vous ai donné. ça a marché pour moi. –

+0

merci pour votre réponse ... mais j'ai essayé aussi. j'ai lié opencv lib et l'ai initialisé aussi. Mais hier, j'ai résolu ce problème après tant de débogage ... le problème était que j'appelais ma fonction dépendante d'opencv dans oncreate(). mais je l'ai retiré de là et l'ai appelé onmanagerconnected() après setcontentview(), il a commencé à fonctionner. je pense qu'opencv lib initialisation a lieu après sur créer dans onmanagerconnected(). J'étais nouveau dans ce domaine, donc je ne le savais pas. – AnShU

+0

@AnShU, pouvez-vous poster votre réponse et l'accepter vous-même? Je veux voir ce code où vous avez placé votre code d'initialisation. –

Répondre

13

son bon que quelqu'un m'a incité à poster ma réponse élaborée. Donc ici, je suis annonce la solution de ma question:

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

Le problème derrière cette erreur est que nous appelons la fonction dépendante de OpenCV (par exemple: Mat()) avant l'initialisation de OpenCV si son erreur montrant. Ainsi, vous pouvez le résoudre si vous mettez votre fonction OpenCV dans onManagerConnected() comme ceci: initialisation

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

ici, startDisplay() contient mon Mat(). Le problème est que lorsque nous démarrons une application, la fonction oncreate() s'exécute d'abord et après que opencv est chargé, donc si vous mettez votre fonction opencv dans oncreate() alors elle affichera l'erreur car opencv n'est pas encore chargé.

J'espère que cela va résoudre votre problème. Bonne chance ... Stackoverflow Rocks !!! :)

Questions connexes