首页 > 解决方案 > 在android studio中找不到本机方法的实现

问题描述

我想通过 OpenCV android 在我的应用程序中集成一些过滤器。我已经设置了 JNI 文件,用于调用本机方法的类。但是每次我运行应用程序时都会出现这个错误。

java.lang.UnsatisfiedLinkError: No implementation found for void com.digitec.owtofthebox.cartoonify.lib.Native.setSketchTexture(long)

我的 jniFile.cpp

 #include <jni.h>
 #include <opencv2/core/core.hpp>
 #include <opencv2/imgproc/imgproc.hpp>
 #include "filters.h"

extern "C" {

ImageFilters* filters = ImageFilters::getInstance();

JNIEXPORT void JNICALL Java_com_digitec_owtofthebox_cartoonify_lib_Native_setScaleFactor(JNIEnv* env, jobject, jdouble scaleFactor)
{ 
    filters->setScaleFactor((double)scaleFactor);
}

JNIEXPORT void JNICALL Java_com_digitec_owtofthebox_cartoonify_lib_Native_setSketchTexture(JNIEnv* env, jobject, jlong sketchTexture)
{ 
    filters->setSketchTexture(*(Mat*)sketchTexture);
}

JNIEXPORT void JNICALL Java_com_digitec_owtofthebox_cartoonify_lib_Native_setSketchFlip(JNIEnv* env, jobject, jboolean sketchFlip)
{ 
    filters->setSketchFlip((bool)sketchFlip);
}

JNIEXPORT void JNICALL Java_com_digitec_owtofthebox_cartoonify_lib_Native_colorCartoonFilter(JNIEnv* env, jobject, jlong addrSrc, jlong addrDst, jint thickness, jint threshold)
{ 
    filters->applyColorCartoon(*(Mat*)addrSrc, *(Mat*)addrDst, (int)thickness, (int)threshold);
}

JNIEXPORT void JNICALL Java_com_digitec_owtofthebox_cartoonify_lib_Native_grayCartoonFilter(JNIEnv* env, jobject, jlong addrSrc, jlong addrDst, jint thickness, jint threshold)
{ 
    filters->applyGrayCartoon(*(Mat*)addrSrc, *(Mat*)addrDst, (int)thickness, (int)threshold);
}

JNIEXPORT void JNICALL Java_com_digitec_owtofthebox_cartoonify_lib_Native_pencilSketchFilter(JNIEnv* env, jobject, jlong addrSrc, jlong addrDst, jint sketchBlend, jint contrast)
{ 
    filters->applyPencilSketch(*(Mat*)addrSrc, *(Mat*)addrDst, (int)sketchBlend, (int)contrast);
}

JNIEXPORT void JNICALL Java_com_digitec_owtofthebox_cartoonify_lib_Native_colorSketchFilter(JNIEnv* env, jobject, jlong addrSrc, jlong addrDst, jint sketchBlend, jint contrast)
{ 
    filters->applyColorSketch(*(Mat*)addrSrc, *(Mat*)addrDst, (int)sketchBlend, (int)contrast);
}

JNIEXPORT void JNICALL Java_com_digitec_owtofthebox_cartoonify_lib_Native_pixelArtFilter(JNIEnv* env, jobject, jlong addrSrc, jlong addrDst, jint pixelSize, jint numColors)
{ 
    filters->applyPixelArt(*(Mat*)addrSrc, *(Mat*)addrDst, (int)pixelSize, (int)numColors);
}

JNIEXPORT void JNICALL Java_com_digitec_owtofthebox_cartoonify_lib_Native_oilPaintFilter(JNIEnv* env, jobject, jlong addrSrc, jlong addrDst, jint radius, jint levels)
{ 
    filters->applyOilPaint(*(Mat*)addrSrc, *(Mat*)addrDst, (int)radius, (int)levels);
}

}

我的母语班

public class Native{



    public static native void setScaleFactor(double scaleFactor);

    public static native void setSketchTexture(long texMatAddr);

    public static native void setSketchFlip(boolean flip);

    public static native void colorCartoonFilter(long srcMatAddr, long dstMatAddr, int thickness, int threshold);

    public static native void grayCartoonFilter(long srcMatAddr, long dstMatAddr, int thickness, int threshold);

    public static native void pencilSketchFilter(long srcMatAddr, long dstMatAddr, int sketchBlend, int contrast);

    public static native void colorSketchFilter(long srcMatAddr, long dstMatAddr, int sketchBlend, int contrast);

    public static native void pixelArtFilter(long srcMatAddr, long dstMatAddr, int pixelSize, int colorNum);

    public static native void oilPaintFilter(long srcMatAddr, long dstMatAddr, int radius, int levels);
}

我还需要什么。我检查了其他帖子,关于 cmake 的一些内容,但无法理解。

标签: javaandroidopencvjava-native-interface

解决方案


你不需要知道 CMake 是如何工作的。您需要做的就是按照此链接中的图片进行操作: https ://kcwong-joe.medium.com/how-to-import-opencv-4-5-2-in-android-studio-d9114179628f


推荐阅读