找不到本机方法:org.opencv.core.Mat.n_Mat :()J

陶菲克

我正在使用本机android Opencv 3.1.0库,但总是显示这样的错误

java.lang.UnsatisfiedLinkError:找不到本机方法:org.opencv.core.Mat.n_Mat :()J

这是我的代码

package com.example.saya.cameraopencv;

public class Hasil extends AppCompatActivity{

private TextView coba;
private ImageView gambarskrg;
private Mat rgba;

final String TAG = "Hello World";

private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS:
            {
                Log.i(TAG, "OpenCV loaded successfully");           
            } break;
            default:
            {
                super.onManagerConnected(status);
            } break;
        }
    }
};
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.hasil_activity);
    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, mOpenCVCallBack);
    Bundle i = getIntent().getExtras();

    gambarskrg = (ImageView) findViewById(R.id.gambar);

    String gambar = Environment.getExternalStorageDirectory()+ "/Coba/Coba_1476987074709.jpg";

    Bitmap bmp = BitmapFactory.decodeFile(gambar);

    Log.i(TAG, "Trying to load OpenCV library");
    if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, mOpenCVCallBack))
    {
        Log.e(TAG, "Cannot connect to OpenCV Manager");
    }
    else {
        Log.e(TAG, "Berhasil");
        try {
            detectEdges(bmp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

private void detectEdges(Bitmap bmp){
    Mat rgba = new Mat();
    Utils.bitmapToMat(bmp, rgba);

    Mat edges = new Mat(rgba.size(), CvType.CV_8UC4);
    Imgproc.cvtColor(rgba, edges, Imgproc.COLOR_RGBA2GRAY, 4);
    Imgproc.Canny(edges, edges, 80, 100);

    Bitmap resultBitmap = Bitmap.createBitmap(edges.cols(), edges.rows(), Bitmap.Config.ARGB_8888);
    Utils.matToBitmap(edges, resultBitmap);
    int nh = (int) ( resultBitmap.getHeight() * (512.0 / resultBitmap.getWidth()) );
    Bitmap scaled = Bitmap.createScaledBitmap(resultBitmap, 512, nh, true);
    gambarskrg.setImageBitmap(scaled);
}

}

这是logcat

10-21 04:02:32.333 21528-21528 / com.example.saya.cameraopencv E / AndroidRuntime:致命例外:主进程:com.example.saya.cameraopencv,PID:21528 java.lang.UnsatisfiedLinkError:未找到本机方法:org.opencv.core.Mat.n_Mat的org.opencv.core.Mat.n_Mat :()J(com.example.saya上的org.opencv.core.Mat。(Mat.java:24)的J. com.example.saya.cameraopencv.Hasil.onCreate(Hasil.java:79)位于android.app.Activity.performCreate(Activity.java)处的.cameraopencv.Hasil.detectEdges(Hasil.java:88)。在Android上的Instrumentation.callActivityOnCreate(Instrumentation.java)在android.app.ActivityThread.performLaunchActivity(ActivityThread.java)在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java)在android.app.ActivityThread.access $ 800(ActivityThread.java)在android .app.ActivityThread $ H.handleMessage(ActivityThread。android.os.Handler.dispatchMessage(Handler.java)上的android.os.Looper.loop(Looper.java)上的android.app.ActivityThread.main(ActivityThread.java)上的java.lang.reflect.Method。 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java)处的java.lang.reflect.Method.invoke(Method.java:515)处的invokeNative(Native Method)位于dalvik.system.NativeStart.main的de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)的ZygoteInit.main(ZygoteInit.java)(本机方法)dalvik.system.NativeStart.main上的de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)上的internal.os.ZygoteInit.main(ZygoteInit.java)(本机方法)dalvik.system.NativeStart.main上的de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)上的internal.os.ZygoteInit.main(ZygoteInit.java)(本机方法)

火花塞

代码存在一些问题。在您的onCreate方法中,您OpenCVLoader.initAsync两次调用该方法,第一次是在消息之后setContentView,第二次是在Log.i(TAG, "Trying to load OpenCV library")消息之后的if语句中您仅应调用OpenCVLoader.initAsync一次方法,OpenCV4Android SDK随附的许多示例都通过该onResume方法来执行此操作要更好地了解这是为什么,请查看本文,它描述了活动生命周期。

这里的第二个问题是您正在尝试Mat在OpenCV完成初始化之前创建对象。创建Mat对象之前,您必须首先等待调用OpenCV初始化方法的异步任务返回到UIThread OpenCV初始化线程完成运行后,将调用该onManagerConnected方法。因此,要解决您的问题,您必须在onManagerConnected方法中调用Mat初始化代码,以确保仅在OpenCV初始化代码完成执行后才调用它。这是一个外观的示例:

private Bitmap bmp;
final String TAG = "Hello World";    

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS: {
                Log.i(TAG, "OpenCV loaded successfully");
                try {
                    detectEdges(bmp);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            break;
            default: {
                super.onManagerConnected(status);
            }
            break;
        }
    }
};

@Override
public void onResume() {
    super.onResume();
    if (!OpenCVLoader.initDebug()) {
        Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, mLoaderCallback);
    } else {
        Log.d(TAG, "OpenCV library found inside package. Using it!");
        mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.hasil_activity);
    Bundle i = getIntent().getExtras();
    String gambar = Environment.getExternalStorageDirectory()+ "/Coba/Coba_1476987074709.jpg";
    bmp = BitmapFactory.decodeFile(gambar);
}

private void detectEdges(Bitmap bmp){
    Mat rgba = new Mat();
    Utils.bitmapToMat(bmp, rgba);

    Mat edges = new Mat(rgba.size(), CvType.CV_8UC4);
    Imgproc.cvtColor(rgba, edges, Imgproc.COLOR_RGBA2GRAY, 4);
    Imgproc.Canny(edges, edges, 80, 100);

    Bitmap resultBitmap = Bitmap.createBitmap(edges.cols(), edges.rows(), Bitmap.Config.ARGB_8888);
    Utils.matToBitmap(edges, resultBitmap);
    int nh = (int) ( resultBitmap.getHeight() * (512.0 / resultBitmap.getWidth()) );
    Bitmap scaled = Bitmap.createScaledBitmap(resultBitmap, 512, nh, true);
    ((ImageView) findViewById(R.id.gambar)).setImageBitmap(scaled);
}

另外,由于您是从外部存储器读取图像的,因此您可能需要请求用户权限才能从存储器读取数据,具体取决于您定位的Android版本。您可以通过将以下代码添加到android清单中来做到这一点:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章