Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.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/7/user-interface/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
如何通过ArrayList<;点>;对于jni C++;功能? 我用Java JNI C++做了一个java项目。我在C++中有以下参数:_Java_Android_C++_Opencv_Java Native Interface - Fatal编程技术网

如何通过ArrayList<;点>;对于jni C++;功能? 我用Java JNI C++做了一个java项目。我在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

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(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,它有一个本机方法的语句,引用了加载它的.cpp
System.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)
在循环内,以避免内存泄漏。