2014-12-04 73 views
-1

現在我得到的錯誤:Unsatisfiedlinkerror本地方法

unsatisfiedLinkerror native method not found.2-04 07:16:34.002: E/AndroidRuntime(1962): java.lang.UnsatisfiedLinkError: Native method not found: com.example.hellocplusplus.MainActivity.camera:()I. 

請幫我

我的C++代碼:

#include <opencv/cv.h> 



#include <jni.h> 




#include <opencv/highgui.h> 





using namespace cv; 



/************************************************************************************************************ 
** 
***********************************************************************************************************/ 



extern "C"{ 

JNIEXPORT jint JNICALL Java_com_example_hellocplusplus_MainActivity_camera 
    (JNIEnv *, jobject); 


JNIEXPORT jint JNICALL Java_com_example_hellocplusplus_MainActivity_camera 
    (JNIEnv *, jobject) 
{ 

      VideoCapture cap(0); // open the video camera no. 0 

      if (!cap.isOpened()) // if not success, exit program 
      { 
       //cout << "Cannot open the video cam" << endl; 
       return -1; 
      } 

      namedWindow("MyVideo", CV_WINDOW_AUTOSIZE); //create a windowcalled "MyVideo" 

      //Show continous video on the output window 
      while (1) 
      { 
       Mat frame; 

       bool bSuccess = cap.read(frame); // read a new frame from video 

       if (!bSuccess) //if not success, break loop 
       { 
        //cout << "Cannot read a frame from video stream" << endl; 
        break; 
       } 

       imshow("MyVideo", frame); //show the frame in "MyVideo" window 

       if (waitKey(30) == 27) //wait for 'esc' key press for 30ms. If 'esc' key is pressed, break loop 
       { 
        //cout << "esc key is pressed by user" << endl; 
        break; 
       } 
      } 

      return (jint) 0; 
     } 

} 

我的Java代碼:

package com.example.hellocplusplus; 

import org.opencv.android.BaseLoaderCallback; 

import org.opencv.android.LoaderCallbackInterface; 



import org.opencv.android.OpenCVLoader; 



import android.os.Bundle; 




import android.app.Activity; 




import android.util.Log; 




import android.view.Menu; 

public class MainActivity extends Activity { 

    public static String TAG="OpenCVImageProcessing"; 
    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { 
     @Override 
     public void onManagerConnected(int status) { 
      switch (status) { 
       case LoaderCallbackInterface.SUCCESS: 
       { 
        System.loadLibrary("nativegray"); 
        Log.i(TAG, "OpenCV loaded successfully"); 

       } break; 
       default: 
       { 
        super.onManagerConnected(status); 
       } break; 
      } 
     } 
    }; 
    public native int camera(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    camera(); 
     //i=camera(); 
     //System.out.println(i); 
     // camera1(); 
    } 
    public void onResume() 
    { 
     super.onResume(); 
     OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9, this, mLoaderCallback); 
    } 







    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 
+0

.so文件在'libs'文件夾中嗎?將「libs」項目文件夾中的Android應用程序庫寫入/ data/data/[package_name]/lib文件夾。在運行期間,如果需要,它們將從此位置加載。檢查http://developer.android.com/training/articles/perf-jni.html#faq_ULE – Gattsu 2014-12-04 12:49:03

+0

yes .so文件位於libs文件夾中。但它不在Android應用程序/ data/data/[packge_name]/lib文件夾中。我認爲它會從opencv管理器中提取。預先感謝 – Mirza 2014-12-05 05:38:36

回答

0

基本上,你的「土着灰」並非如此加載,當你打電話給camera()的代碼。

你不能調用的onCreate()任何OpenCV的代碼,因爲OpenCV的這樣的(和你自己的,太)只拿到了裝,一旦mLoaderCallback完成,這會從的onResume()

,然後,你的c叫++代碼會有從來沒有工作。

您無法在android(E_NOKEYBOARD), 和while(1)循環中調用namedWindow(),imshow()或waitKey(),因爲它會阻止您的活動。

+0

我認爲你是對的@berak你將提供的任何鏈接,以糾正C++代碼。當我打電話給mLoaderCallback時,在攝像機本地方法調用之前創建它顯示相同的錯誤 – Mirza 2014-12-05 05:20:43

+0

,您將不得不將攝像機()代碼移動到onCameraViewStarted()或類似的位置。 – berak 2014-12-05 08:25:35