简体   繁体   中英

java.lang.UnsatisfiedLinkError: Native method not found

I tried to use cvtcolor code by native method, but I get that native method not found error.

This is my cpp+ code:

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


}

Main Activity;

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

My error is that:

 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)

I tried to call native method but everytime, I get this error. Please somebody help me.

You must first understand the basic things while creating a JNI, The first question is, How would your java package refer to the desired native method, and for this purpose we use whole package name joined by underscores _ and method name appended at the end. That is the very first condition for your JNI method to link with the specified java call

In your case the package name is com.example.alper.counting , and the class name is CoutingClass and the native method name is convertGray . So the JNI wrapper must be:

JNIEXPORT jlong JNICALL Java_com_example_alper_counting_CoutingClass_convertGray

You must follow the JNI standard in order to create native API. Docs

ZdaR Explained it well, i would like to recommend you to generate your header file with javah also Android Studio from ver. 2.2 has a nice NDK support and it can generate those files for you.

What i see as a problem is that in your .cpp your function return long and in java you declare the native function to return int.

Change this:

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

to this:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM