如何为<Point> jni C++函数传递 ArrayList?

How to pass a ArrayList<Point> for a jni C++ function?

本文关键字:函数 C++ ArrayList gt lt Point jni      更新时间:2023-10-16

我正在做一个Java项目与Android jni c++。我在c++中有一个函数,参数如下:

c++功能:void rectify (vector <Point2f> & corners, Mat & img) {...}

JAVA中,调用将是:
Mat image = Highgui.imread("img.png");
List <MatOfPoint> cornners =  new ArrayList<MatOfPoint>();;
Point b = new Point (real_x2, real_y2);
MatOfPoint ma = new MatOfPoint (b);
cornners.add(ma);
rectfy(image.getNativeObjAddr(), cornners)

public native void rectfy(long mat, "??" matofpoint);

有了这个,我想知道函数c++ jni:

JNIEXPORT void JNICALL Java_ImageProcessingActivity_rectfy (JNIEnv * jobject, ?? cornners, inputMatAddress jlong)

如果我理解正确的话,你想做的是将一堆点从Java传递到c++,那么我认为这大致是你正在寻找的:

#include <vector>
#include <jni.h>
class Point2f {
public:
    double x;
    double y;
    Point2f(double x, double y) : x(x), y(y) {}
};
extern "C" JNIEXPORT void JNICALL Java_com_example_ImageProcessingActivity_transferPointsToNative(JNIEnv* env, jobject self, jobject input) {
    jclass alCls = env->FindClass("java/util/ArrayList");
    jclass ptCls = env->FindClass("java/awt/Point");
    if (alCls == nullptr || ptCls == nullptr) {
        return;
    }
    jmethodID alGetId  = env->GetMethodID(alCls, "get", "(I)Ljava/lang/Object;");
    jmethodID alSizeId = env->GetMethodID(alCls, "size", "()I");
    jmethodID ptGetXId = env->GetMethodID(ptCls, "getX", "()D");
    jmethodID ptGetYId = env->GetMethodID(ptCls, "getY", "()D");
    if (alGetId == nullptr || alSizeId == nullptr || ptGetXId == nullptr || ptGetYId == nullptr) {
        env->DeleteLocalRef(alCls);
        env->DeleteLocalRef(ptCls);
        return;
    }
    int pointCount = static_cast<int>(env->CallIntMethod(input, alSizeId));
    if (pointCount < 1) {
        env->DeleteLocalRef(alCls);
        env->DeleteLocalRef(ptCls);
        return;
    }
    std::vector<Point2f> points;
    points.reserve(pointCount);
    double x, y;
    for (int i = 0; i < pointCount; ++i) {
        jobject point = env->CallObjectMethod(input, alGetId, i);
        x = static_cast<double>(env->CallDoubleMethod(point, ptGetXId));
        y = static_cast<double>(env->CallDoubleMethod(point, ptGetYId));
        env->DeleteLocalRef(point);
        points.push_back(Point2f(x, y));
    }
    env->DeleteLocalRef(alCls);
    env->DeleteLocalRef(ptCls);
}

与Java中相应的方法声明:

private native void transferPointsToNative(ArrayList<Point> input);