2016-11-29 3 views
1

Я попытался использовать код cvtcolor по собственному методу, но я получаю, что собственный метод не нашел ошибку.java.lang.UnsatisfiedLinkError: родной метод не найден

Это мой каст + код:

#include <com_example_alper_asd_AsdClass.h> 

JNIEXPORT jlong JNICALL Java_com_example_alper_asd_AsdClass_convGray 
    (JNIEnv *, jclass, jlong matAddrRgba, jlong matAddrGray) { 
Mat &mRgba= *(Mat*)mAddrRgba; 
Mat &mGray= *(Mat*)mAddrGary; 
long conv; 
jint retval; 
conv = toGray (mRgba ,mGray); 
retval = (jint)conv; 
return retval; 

    } 
long togray (Mat img, Mat &Gray){ 
cvtColor(img, gray, CV_RGBA2GRAY); 
    if (gray.rows == img.rows && gray.cols == img.cols) 
     return 1; 
    return 0; 


} 

Основная деятельность;

package com.example.alper.counting; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 

import org.opencv.android.BaseLoaderCallback; 
import org.opencv.android.CameraBridgeViewBase; 
import org.opencv.android.JavaCameraView; 
import org.opencv.android.LoaderCallbackInterface; 
import org.opencv.android.OpenCVLoader; 
import org.opencv.core.CvType; 
import org.opencv.core.Mat; 
import org.opencv.imgproc.Imgproc; 

public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2{ 
private static String TAG = "MainActivity"; 
JavaCameraView javaCameraView; 
    Mat mRgba ,mGray; 

     static { 

      System.loadLibrary("MyLibs"); 
     } 


    BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { 
     @Override 
     public void onManagerConnected(int status) { 
      switch (status) 
      { 
       case BaseLoaderCallback.SUCCESS: 
        javaCameraView.enableView(); 
        break; 
       default: 

      super.onManagerConnected(status); 
      break; 
      } 
     } 
    }; 
    static { 

     System.loadLibrary("MyLibs"); 
    } 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     javaCameraView = (JavaCameraView) findViewById(R.id.java_camera_view); 
     javaCameraView.setVisibility(View.VISIBLE); 
     javaCameraView.setCvCameraViewListener(this); 
    } 
    @Override 
    protected void onPause() { 
     super.onPause(); 
     if (javaCameraView != null) 
      javaCameraView.disableView(); 
    } 
    @Override 
    protected void onResume() { 
     super.onResume(); 
     if (OpenCVLoader.initDebug()) { 
      Log.i(TAG, "Opencv loading Success"); 
      mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); 
     } 
     else 
      Log.i(TAG, "Opencv is not loading"); 
     OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9, this ,mLoaderCallback); 
    } 


    @Override 
    public void onCameraViewStarted(int width, int height) { 
     mRgba = new Mat(height, width, CvType.CV_8UC4); 
     mGray = new Mat(height, width, CvType.CV_8UC1); 
    } 

    @Override 
    public void onCameraViewStopped() { 
     mRgba.release(); 

    } 

    @Override 
    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { 
     mRgba= inputFrame.rgba(); 
     CoutingClass.convertGray(mRgba.getNativeObjAddr(),mGray.getNativeObjAddr()); 
     return mGray; 

    } 

} 

package com.example.alper.counting; 

/** 
* Created by alper on 27.11.2016. 
*/ 

public class CoutingClass { 
    public native static int convertGray (long mAddrRgba ,long mAddrGray); 
} 

Моя ошибка в том, что:

FATAL EXCEPTION: Thread-644 
    Process: com.example.alper.counting, PID: 20285 
    java.lang.UnsatisfiedLinkError: Native method not found: com.example.alper.counting.CoutingClass.convertGray:(JJ)I 
     at com.example.alper.counting.CoutingClass.convertGray(Native Method) 
     at com.example.alper.counting.MainActivity.onCameraFrame(MainActivity.java:89) 
     at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:387) 
     at org.opencv.android.JavaCameraView$CameraWorker.run(JavaCameraView.java:328) 
     at java.lang.Thread.run(Thread.java:841) 

Я попытался назвать нативный метод, но каждый раз, когда я получаю эту ошибку. Пожалуйста, помогите мне.

+0

Посмотрите на это [Q & A] (http://stackoverflow.com/questions/24566127/jni-java-lang-unsatisfiedlinkerror- уроженец-метод-не-найден). Шаг 1 при написании [хорошего вопроса] (http://stackoverflow.com/help/how-to-ask) должен сделать некоторые исследования в первую очередь. Если бы вы искали Stackoverflow, вы бы нашли несколько возможных ответов. – MikeJRamsey56

ответ

0

Прежде всего, вы должны понять основные вещи при создании JNI. Первый вопрос: как ваш пакет java ссылается на нужный собственный метод, и для этой цели мы используем целое имя пакета, соединенное символами подчёркивания _, и имя метода добавлено в конце. Это очень первое условие для вашего метода JNI для связи с указанным Java вызова

В вашем случае имя пакета является com.example.alper.counting, и имя класса CoutingClass и родное имя метода convertGray. Таким образом, оболочка JNI должны быть:

JNIEXPORT jlong JNICALL Java_com_example_alper_counting_CoutingClass_convertGray 

Вы должны следовать стандарту JNI для создания родной API. Docs

+0

Я решил эту проблему, но теперь я получаю эту ошибку A/libc: Fatal signal 11 (SIGSEGV) на 0x000000b4 (код = 1), поток 9372 do yu есть представление об этой ошибке. –

0

ZdaR Объяснил это хорошо, я хотел бы рекомендовать вам сгенерировать заголовочный файл с помощью javah и Android Studio от ver. 2.2 имеет приятный NDK support, и он может генерировать эти файлы для вас.

Что я вижу в качестве проблемы, так это то, что в вашей .cpp ваша функция возвращает long, а в java вы объявляете родную функцию возвращать int.

Изменить это:

public class CoutingClass { 
    public native static int convertGray (long mAddrRgba ,long mAddrGray); 
} 

к этому:

public class CoutingClass { 
    public native static long convertGray (long mAddrRgba ,long mAddrGray); 
} 
+0

Я использовал уже javah, я создал код cpp, который был отправлен в javah. –

+0

На самом деле мой код AsdClass.java: пакет com.example.alper.asd; /** * Создано alper 28.11.2016. */ Публичный класс AsdClass { общедоступный статический long convGray (long matAddrRgba, long matAddrGray); } Но опять же такая же ошибка –

+0

Является ли объявление в заголовке совпадающим с определением в .cpp? – emKaroly