2014-12-04 2 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. 

Pls помочь мне

Мой 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'? Библиотеки приложений Android в папке проекта «libs» записываются в папку/data/data/[package_name]/lib. Во время выполнения они загружаются из этого места, если это необходимо. Проверьте http://developer.android.com/training/articles/perf-jni.html#faq_ULE – Gattsu

+0

файл .so находится в папке libs. но его не в Android Application/data/data/[packge_name]/lib folder.I думаю, что это займет от opencv manager.thanks заранее – Mirza

ответ

0

в принципе, ваш «родной» так не был когда вы вызвали код camera().

вы не можете вызвать любой код OpenCV в OnCreate(), так как OpenCV так (и ваши собственные тоже) только был загружен, когда mLoaderCallback заканчивает, который вызывается из onResume()

, а затем, ваш C++ код будет никогда работа.

Вы не можете вызвать namedWindow(), imshow() или waitKey() на android (E_NOKEYBOARD), , а цикл while (1) не является законным, так как он остановит вашу активность.

+0

Я думаю, что вы правы @berak любую ссылку, которую вы предоставите, чтобы исправить код C++. когда я вызываю mLoaderCallback в on, создайте до того, как родной метод камеры вызовет его показ той же самой ошибки – Mirza

+0

, вам придется переместить код камеры() на onCameraViewStarted() или аналогичный. – berak

Смежные вопросы