2013-02-04 12 views
8

के साथ opencv2.4.3 का उपयोग करते समय n_Mat मैं एंड्रॉइड में opencv का उपयोग कर रहा हूं। लेकिन जब मैं अपने कोड में मैट() जोड़ रहा हूं तो मेरा एप्लिकेशन अनपेक्षित रूप से लॉन्च के बाद बंद हो जाता है। मेरी त्रुटि लॉग के रूप में नीचे है:असंतुष्ट लिंक्स त्रुटि: एंड्रॉइड 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)` 

मेरी कोड

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 पर उपलब्ध कराई गई अन्य समाधान की कोशिश की है, लेकिन उनमें से कोई भी मेरे लिए काम किया। मैंने पहले ही libopencv_java.so और libopencv_info.so को अपने/libs फ़ोल्डर में F: \ OpenCV-2.4.3.2-android-sdk \ sdk \ native \ libs \ armeabi-v7a से कॉपी किया है लेकिन यह त्रुटि एक ही है।

कृपया मदद करें। अग्रिम :)

+0

प्रश्न [यहां] देखें (http://stackoverflow.com/questions/11614227/android-unsatisfiedlinkerror-with-opencv-2-4-2)। मुझे एक ही समस्या हो रही थी और लाइन को समस्या को अलग कर दिया गया है: Mat m = new Mat(); मैट एम = शून्य; और मैट एम; काम करता है लेकिन मुझे उनकी आवश्यकता नहीं है। वैसे भी, [लिंक] आज़माएं (http://stackoverflow.com/questions/11614227/android-unsatisfiedlinkerror-with-opencv-2-4-2) मैंने आपको दिया। यह मेरे लिए काम किया। –

+0

आपकी प्रतिक्रिया के लिए धन्यवाद ... लेकिन मैंने कोशिश की। मैंने ओपनसीवी लिब को जोड़ा है और इसे भी शुरू किया है। लेकिन कल मैंने इस समस्या को इतनी डिबगिंग के बाद हल किया ... समस्या यह थी कि मैं अपने ओपनसीवी आश्रित समारोह को ऑनक्रेट() में बुला रहा था। लेकिन मैंने इसे वहां से हटा दिया और इसे setcontentview() के बाद onmanagerconnected() में बुलाया, यह काम करना शुरू कर दिया। मुझे लगता है कि onmanagerconnected() में बनाने के बाद opencv lib प्रारंभ होता है। मैं इस क्षेत्र में नया था इसलिए उसे नहीं पता था। – 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() मेरी चटाई() प्रारंभ होता है। समस्या यह है कि जब हम एक ऐप शुरू करते हैं तो ऑनक्रेट() फ़ंक्शन पहले निष्पादित होता है और उसके बाद ओपनसीवी लोड हो जाता है, इसलिए यदि आप अपना ओपनसीवी फ़ंक्शन ऑनक्रेट() में डालते हैं तो यह त्रुटि दिखाएगा क्योंकि ओपनसीवी अभी तक लोड नहीं हुआ है।

मुझे आशा है कि इससे आपकी समस्या हल हो जाएगी। शुभकामनाएं ... Stackoverflow चट्टानों !!! :)

संबंधित मुद्दे