如何通过ArrayList<;点>;对于jni C++;功能? 我用Java JNI C++做了一个java项目。我在C++中有以下参数:
C++函数:如何通过ArrayList<;点>;对于jni C++;功能? 我用Java JNI C++做了一个java项目。我在C++中有以下参数:,java,android,c++,opencv,java-native-interface,Java,Android,C++,Opencv,Java Native Interface,C++函数: void rective(向量和角点、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
void rective(向量和角点、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)
Mat image=Highgui.imread(“img.png”);
List cornners=new ArrayList();;
点b=新点(实际值x2,实际值y2);
MatOfPoint ma=新的MatOfPoint(b);
添加(ma);
rectfy(image.getNativeObjAddr(),cornners)
public-native-void-rectfy(长垫,“?”点)代码>
我想知道函数C++ +JNI:< /P>
<> >代码> jn导出无效,jjaajava图像处理C++(JNENV*JOBJET,.CONNEAVER,输入地址AjyJOLN)< /代码> < /P> < P>如果您正确理解,您要做的是将一组点从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);
}
#包括
#包括
类点2f{
公众:
双x;
双y;
点2f(双x,双y):x(x),y(y){
};
外部“C”JNIEXPORT void JNICALL Java_com_示例_ImageProcessingActivity_TransferPointsToctive(JNIEnv*env、作业对象自身、作业对象输入){
jclass alCls=env->FindClass(“java/util/ArrayList”);
jclass ptCls=env->FindClass(“java/awt/Point”);
如果(alCls==nullptr | | ptCls==nullptr){
返回;
}
jmethodidealgetid=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”);
如果(alGetId==nullptr | | alSizeId==nullptr | | ptGetXId==nullptr | | ptGetYId==nullptr){
env->DeleteLocalRef(alCls);
env->DeleteLocalRef(ptCls);
返回;
}
int pointCount=static_cast(env->CallIntMethod(input,alSizeId));
如果(点计数<1){
env->DeleteLocalRef(alCls);
env->DeleteLocalRef(ptCls);
返回;
}
std::向量点;
点数。保留(点数);
双x,y;
对于(int i=0;iCallObjectMethod(输入,alGetId,i);
x=静态_cast(env->CallDoubleMethod(point,ptGetXId));
y=静态_cast(env->CallDoubleMethod(point,ptGetYId));
env->DeleteLocalRef(点);
点。向后推(点2f(x,y));
}
env->DeleteLocalRef(alCls);
env->DeleteLocalRef(ptCls);
}
使用Java中相应的方法声明:
private native void transferPointsToNative(ArrayList<Point> input);
私有本机void transferPointsToNative(ArrayList输入);
您是否尝试过在Java端使用您想要的接口创建Java本机方法,并使用javah
创建C端头?我正在Eclipse中使用NDK。我有一个.java,它有一个本机方法的语句,引用了加载它的.cppSystem.loadLibrary(“rectitylib”)
,“rectitylib”指向文件夹中的jni-parts.cpp,jni它有一个方法JNICALL java\u ImageProcessingActivity\u recify(…)。
你想知道函数是什么吗?问题是什么?您正在寻找关键字void
?我想知道的是如何为C++jni中的代码传递ArrayList(vector)
java。C++中的函数将接收什么类型的参数?据我所知,在JNI中,所有类(非原语)都作为jobject
传递。同样,当您想从C++传递java类时,返回一个作业项< /C> >,它被实例化为,例如<代码> ARARYLIST//COD>。我想你可以找到几个JNI的例子/教程,这些例子/教程比我解释得更好。对于后代/记录,在从Java\u com\u example\u ImageProcessingActivity\u transferpointstontive
和env->DeleteLocalRef(alCls
和ptCls)
返回之前,你需要env->DeleteLocalRef(point)
在循环内,以避免内存泄漏。