2013-02-04 32 views
8

tôi đang sử dụng opencv trong android. nhưng khi tôi thêm Mat() vào mã của tôi, ứng dụng của tôi đột ngột dừng sau khi khởi chạy. log lỗi của tôi là như sau:UnsatisfiedLinkError: n_Mat trong khi sử dụng opencv2.4.3 với 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)` 

mã của tôi là

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

    } 

} 

}

tôi đã cố gắng giải pháp khác được cung cấp trên stackoverflow nhưng không ai trong số họ làm việc cho tôi. tôi đã sao chép libopencv_java.so và libopencv_info.so vào thư mục/libs của tôi từ F: \ OpenCV-2.4.3.2-android-sdk \ sdk \ native \ libs \ armeabi-v7a nhưng lỗi này vẫn giữ nguyên.

vui lòng trợ giúp.

cảm ơn trước :)

+0

Kiểm tra câu hỏi [tại đây] (http://stackoverflow.com/questions/11614227/android-unsatisfiedlinkerror-with-opencv-2-4-2). Tôi đã có những vấn đề tương tự và đã phân lập vấn đề với dòng: Mat m = new Mat(); Mat m = null; và Mat m; nhưng tôi không cần chúng. Dù sao, hãy thử [link] (http://stackoverflow.com/questions/11614227/android-unsatisfiedlinkerror-with-opencv-2-4-2) Tôi đã cho bạn. nó làm việc cho tôi. –

+0

cảm ơn phản hồi của bạn ... nhưng tôi cũng đã thử điều đó. tôi đã liên kết với opencv lib và khởi tạo nó. Nhưng hôm qua tôi đã giải quyết vấn đề này sau khi gỡ lỗi quá nhiều ... vấn đề là tôi đã gọi hàm opencv phụ thuộc của tôi trong oncreate(). nhưng tôi gỡ bỏ nó từ đó và gọi nó trong onmanagerconnected() sau khi setcontentview(), nó bắt đầu hoạt động. tôi nghĩ rằng khởi tạo opencv lib diễn ra sau khi tạo trong onmanagerconnected(). tôi mới trong lĩnh vực này nên không biết điều đó. – AnShU

+0

@AnShU, bạn có thể đăng câu trả lời và chấp nhận nó không? Tôi muốn xem mã mà bạn đã đặt mã khởi tạo của mình. –

Trả lời

13

tốt rằng ai đó đã nhắc tôi đăng câu trả lời của tôi một cách công phu. vì vậy đây tôi đang đăng các giải pháp của câu hỏi của tôi:

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

Vấn đề đằng sau lỗi này là chúng ta đang kêu gọi chức năng phụ thuộc opencv (ví dụ: Mat()) trước khi opencv khởi nên lỗi hiển thị của nó. Vì vậy, bạn có thể giải quyết nó nếu bạn đặt chức năng opencv của mình trong onManagerConnected() như sau:

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

here, startDisplay() chứa khởi tạo Mat() của tôi. Vấn đề là khi chúng ta bắt đầu một ứng dụng thì hàm oncreate() thực thi đầu tiên và sau đó opencv được nạp, vì vậy nếu bạn đặt hàm opencv của mình trong oncreate() thì nó sẽ hiển thị lỗi khi opencv chưa được tải.

Tôi hy vọng điều này sẽ giải quyết được vấn đề của bạn. Hay nhất của may mắn ... Stackoverflow Rocks !!! :)