2013-02-04 9 views
8

私はアンドロイドでopencvを使用しています。私のコードにMat()を追加すると、アプリケーションは起動後に予期せず停止します。私のエラーログは以下の通りです:UnsatisfiedLinkError:アンドゥー4.0でopencv2.4.3を使用中にn_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)` 

私のコードは、私はstackoverflowの上で提供される他のソリューションを試みたが、それらのどれも私のために働いていない

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

    } 

} 

}

です。私は既にlibopencv_java.soとlibopencv_info.soをF:\ OpenCV-2.4.3.2-android-sdk \ sdk \ native \ libs \ armeabi-v7aから/ libsフォルダにコピーしましたが、このエラーは同じです。

助けてください。事前に

感謝:)

+0

質問を[ここ](http://stackoverflow.com/questions/11614227/android-unsatisfiedlinkerror-with-opencv-2-4-2)で確認してください。私は同じ問題を抱えていて、その問題を次の行に分けました:Mat m = new Mat(); Mat m = null;マットm;私はそれらを必要としません。とにかく、私があなたに与えた[リンク](http://stackoverflow.com/questions/11614227/android-unsatisfiedlinkerror-with-opencv-2-4-2)を試してみてください。それは私のために働いた。 –

+0

あなたの応答に感謝します...でも、私もそれを試みました。私はopencv libをリンクし、それを初期化しました。しかし、昨日、私は非常に多くのデバッグの後にこの問題を解決しました...問題は、私がoncreate()で自分のopencv依存関数を呼び出すことでした。私はそこからそれを削除し、setcontentview()の後にonmanagerconnected()で呼び出すと、動作し始めました。 opencv lib初期化はonmanagerconnected()で作成した後に行われると思います。私はこの分野では新しいので、それを知らなかった。 – AnShU

+0

@AnShU、あなたはあなたの答えを投稿し、それをあなたの自己受け入れることができますか?私はあなたの初期化コードを配置したコードを見たいと思います。 –

答えて

13

その良い誰かが精巧に私の答えを投稿するために私を促したこと。ので、ここで私は私の質問の解決策を掲載しています:その示すエラーので、OpenCVの初期化の前に:(マット()例)

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の依存の関数を呼び出しているということです。あなたはこのように()onManagerConnectedであなたのOpenCVの機能を置くのであれば、あなたはそれを解決することができます

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

、startDisplayは()私のマット()の初期化が含まれています。問題は、アプリケーションを起動した後、最初にoncreate()関数が実行され、opencvがロードされた後にoncreate()にopencv関数を置くとopencvがまだロードされていないためエラーが表示されます。

これがあなたの問題を解決することを願っています。幸運のベスト... Stackoverflow Rocks !!! :)