如何为 jni C++ 函数传递 ArrayList<Point>?
How to pass a ArrayList<Point> for a jni C++ function?
我正在 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);
我正在 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);