Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解决Android中找不到double的实现?_Java_C#_Android_C++_Android Studio - Fatal编程技术网

Java 如何解决Android中找不到double的实现?

Java 如何解决Android中找不到double的实现?,java,c#,android,c++,android-studio,Java,C#,Android,C++,Android Studio,java.lang.unsatifiedLinkError:未找到double com.example.tadipta.handspirate.findInscribedCircleJNI(长、双、双、双、双、双[]、双[]、长)的实现(尝试了java_com_示例_tadipta_handspirate_findInscribedCircleJNI和java_com_tadipta_handspirate_findInscribedCircleJNI_3D_3DJ) 位于com.example

java.lang.unsatifiedLinkError:未找到double com.example.tadipta.handspirate.findInscribedCircleJNI(长、双、双、双、双、双[]、双[]、长)的实现(尝试了java_com_示例_tadipta_handspirate_findInscribedCircleJNI和java_com_tadipta_handspirate_findInscribedCircleJNI_3D_3DJ) 位于com.example.tadipta.handspirture.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, double, double, 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, double, double, double, double, double[], double[], 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)
这是my 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, jobject obj, jlong imgAddr,
        jdouble rectTLX, jdouble rectTLY, jdouble rectBRX, jdouble rectBRY,
        jdoubleArray incircleX, jdoubleArray incircleY, 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, 0 , 1, (const jdouble*)outArrayX);
    env->SetDoubleArrayRegion(incircleY, 0 , 1, (const jdouble*)outArrayY);
    //Core.circle(img, inCircle, (int)inCircleRadius, new Scalar(240,240,45,0), 2);


    return r;
}
}
这是我的应用程序。mk:

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-8
这是我的身材。格雷德尔:

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')
}

还有我的handspirture.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, inCircle, (int)inCircleRadius, new Scalar(240,240,45,0), 2);
        Imgproc.circle(img, inCircle, 3, Scalar.all(0), -2);
    }
你能告诉我有什么问题吗?由于本机方法无法实现

此问题已得到解决
我忘了在
local.properties
上添加我的ndk源代码,只是像这样添加了你的ndk源代码
ndk.dir=C\:\\Users\\dipta\\AppData\\local\\Android\\Sdk\\ndk bundle
,然后在你的应用程序上添加这个代码
APP STL:=C++\u shared
。mk

我计算了9个参数。看起来打电话的人有8个。
 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, inCircle, (int)inCircleRadius, new Scalar(240,240,45,0), 2);
        Imgproc.circle(img, inCircle, 3, Scalar.all(0), -2);
    }