我尝试通过 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/