java - 在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 的一些内容,但无法理解。
解决方案
你不需要知道 CMake 是如何工作的。您需要做的就是按照此链接中的图片进行操作: https ://kcwong-joe.medium.com/how-to-import-opencv-4-5-2-in-android-studio-d9114179628f
推荐阅读
- algorithm - 为什么数字以 "12-256" 、 "13-256" 而不是 12,13 等形式打印?
- javascript - 创建一个对象的多个实例(通过在其名称中添加递增数字)并添加Child 到阶段
- google-apps-script - 谷歌表格中的脚本编辑器没有通过电子邮件发送超链接
- javascript - 为什么“function f(x,x){}”在 Javascript 中是有效的语法?
- vb.net - 字体分辨率突然改变
- python-3.x - 如何在字符串python 3中移动子字符串
- dxf - DXF 文件格式 - 如何编辑 DXF 以使路径正常工作
- java - 无法分配请求的地址:远程机器发生 JVM_Bind 异常
- python - Python Zip 文件读取
- python-requests - 忽略设置 OP_NO_SSLv3 的请求