java.lang.UnsatisfiedLinkError:对double com.example.tadipta.HandGesture.findInscribedCircleJNI(long,double,double,double,double,double [],double [],long []均未找到实现) 在com.example.tadipta.HandGesture.findInscribedCircleJNI(本机方法)
我想使用openCV 4.1.0构建android应用程序以检测手语和带有C ++ / C项目的某些外部本机方法
这是我的错误:
11-07 03:42:19.233 15585-15971/? E/art: No implementation found for double com.example.tadipta.HandGesture.findInscribedCircleJNI(long,double,double[],long) (tried Java_com_example_tadipta_HandGesture_findInscribedCircleJNI and Java_com_example_tadipta_HandGesture_findInscribedCircleJNI__JDDDD_3D_3DJ)
11-07 03:42:19.233 15585-15971/? E/AndroidRuntime: FATAL EXCEPTION: Thread-114866
Process: com.example.tadipta,PID: 15585
java.lang.UnsatisfiedLinkError: No implementation found for double com.example.tadipta.HandGesture.findInscribedCircleJNI(long,long) (tried Java_com_example_tadipta_HandGesture_findInscribedCircleJNI and Java_com_example_tadipta_HandGesture_findInscribedCircleJNI__JDDDD_3D_3DJ)
at com.example.tadipta.HandGesture.findInscribedCircleJNI(Native Method)
at com.example.tadipta.HandGesture.findInscribedCircle(HandGesture.java:261)
at com.example.tadipta.Mainactivity.makeContours(Mainactivity.java:688)
at com.example.tadipta.Mainactivity.onCameraFrame(Mainactivity.java:562)
at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:393)
at org.opencv.android.JavaCameraView$CameraWorker.run(JavaCameraView.java:373)
at java.lang.Thread.run(Thread.java:818)
这是我的jni_process.cpp:
#include <jni.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <vector>
using namespace std;
using namespace cv;
extern "C" {
JNIEXPORT jdouble JNICALL Java_com_example_tadipta_HandGesture_findInscribedCircleJNI(JNIEnv* env,jobject obj,jlong imgAddr,jdouble rectTLX,jdouble rectTLY,jdouble rectBRX,jdouble rectBRY,jdoubleArray incircleX,jdoubleArray incircleY,jlong contourAddr);
JNIEXPORT jdouble JNICALL Java_com_example_tadipta_HandGesture_findInscribedCircleJNI(JNIEnv* env,jlong contourAddr)
{
Mat& img_cpp = *(Mat*)imgAddr;
//vector<Point2f>& contour = *(vector<Point2f> *)contourAddr;
Mat& contourMat = *(Mat*)contourAddr;
vector<Point2f> contourVec;
contourMat.copyTo(contourVec);
double r = 0;
double targetX = 0;
double targetY = 0;
for (int y = (int)rectTLY; y < (int)rectBRY; y++)
{
for (int x = (int)rectTLX; x < (int)rectBRX; x++)
{
double curDist = pointPolygonTest(contourVec,Point2f(x,y),true);
if (curDist > r) {
r = curDist;
targetX = x;
targetY = y;
}
}
}
jdouble outArrayX[] = {0};
jdouble outArrayY[] = {0};
outArrayX[0] = targetX;
outArrayY[0] = targetY;
env->SetDoubleArrayRegion(incircleX,1,(const jdouble*)outArrayX);
env->SetDoubleArrayRegion(incircleY,(const jdouble*)outArrayY);
//Core.circle(img,inCircle,(int)inCircleRadius,new Scalar(240,240,45,0),2);
return r;
}
}
这是我的Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include ../../opencv-4.1.0-android-sdk/OpenCV410androidSDK/sdk/native/jni/OpenCV.mk
LOCAL_MODULE := TAdipta
LOCAL_SRC_FILES := jni_process.cpp
LOCAL_LDLIBS += -llog -ldl
include $(BUILD_SHARED_libraRY)
include $(CLEAR_VARS)
LOCAL_C_INCLUDES += $(JNI_H_INCLUDE)
LOCAL_SRC_FILES := \
jni/onload.cpp \
jni/info_kunli_androidlibsvmexample_AndroidLibsvmExampleactivity.cpp \
src/train.cpp \
src/predict.cpp \
src/svm/svm-train.cpp \
src/svm/svm-predict.cpp \
src/svm/svm.cpp
LOCAL_MODULE := libsignal
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_libraRY)
这是我的Application.mk:
APP_STL := gnustl_static
APP_CPPflaGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-8
这是我的build.gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationid "com.example.tadipta"
minSdkVersion 15
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'
}
}
sourceSets { main { jni.srcDirs = ['src/main/jni','src/main/jniLibs/'] } }
externalNativeBuild {
ndkBuild {
path file('src/main/cpp/Android.mk')
}
}
}
dependencies {
implementation fileTree(dir: 'libs',include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation project(path: ':opencv')
}
这是我的HandGesture.java的这一部分:
public native double findInscribedCircleJNI(long imgAddr,double rectTLX,double rectTLY,double rectBRX,double rectBRY,double[] incircleX,double[] incircleY,long contourAddr);
void findInscribedCircle(Mat img)
{
Point tl = boundingRect.tl();
Point br = boundingRect.br();
double[] cirx = new double[]{0};
double[] ciry = new double[]{0};
inCircleRadius = findInscribedCircleJNI(img.getNativeObjAddr(),tl.x,tl.y,br.x,br.y,cirx,ciry,approxContour.getNativeObjAddr());
inCircle.x = cirx[0];
inCircle.y = ciry[0];
Imgproc.circle(img,2);
Imgproc.circle(img,3,Scalar.all(0),-2);
}
你能告诉我什么问题吗?因为本地方法无法实现