java.lang.UnsatisfiedLinkError : Native method not found 错误

标签 java android c++ opencv unsatisfiedlinkerror

我尝试通过 native 方法使用 cvtcolor 代码,但我收到找不到 native 方法的错误。

这是我的 cpp+ 代码:

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


}

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

我的错误是:

 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)

我尝试调用 native 方法,但每次都会出现此错误。请有人帮助我。

最佳答案

在创建 JNI 时,您必须首先了解基本知识,第一个问题是,您的 java 包将如何引用所需的 native 方法,为此我们使用由下划线连接的整个包名 _ 和最后附加的方法名称。这是您的 JNI 方法与指定的 java 调用链接的第一个条件

在您的例子中,包名称是 com.example.alper.counting,类名称是 CoutingClass,本地方法名称是 convertGray。所以 JNI 包装器必须是:

JNIEXPORT jlong JNICALL Java_com_example_alper_counting_CoutingClass_convertGray

您必须遵循 JNI 标准才能创建 native API。 Docs

关于java.lang.UnsatisfiedLinkError : Native method not found 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40856987/

相关文章:

java - 如何在java eclipse中运行svm light?

java - 为什么 OkHttp post 方法发送的是 get 请求而不是 post 请求?

java - Gradle 构建失败 : Dex files cannot exceed 64k

c++ - 服务器支持多个客户端监听吗?

c++ - move 构造函数是否需要可 move 的属性?

java - Java 中的枚举类型和构建一副纸牌

java - Maven 命名约定 32 位与 64 位以及 Windows 与 Linux

java - 无法使用 Java 语言访问类,但可以使用 Kotlin 访问类

java - Android 蓝牙连接 - 服务发现失败

c++ - 为什么 'std::vector<int> b{2};' 创建一个 1 元素 vector ,而不是 2 元素 vector ?