Java应用程序的JNI-c++变量值

JNI - c++ variable value to Java-application

本文关键字:变量值 JNI-c++ 应用程序 Java      更新时间:2023-10-16

所以我有一个JNI函数,它给了我一些x和y值。我想把值发送到java应用程序,但由于它是一个JNICall,我不知道该怎么做?

JNIEXPORT void JNICALL Java_com_example_foo(JNIEnv env*, jclass FooClass, jlong matRgba,) {
Mat& rgba = *(Mat*)matRgba;
jmethodID mid_getCoord = env->GetStaticMethodID(FooClass, "getCoord", "(II)V");
detect(rgba);
}
void detect(Mat& frame){
String eye_cascade_name = "test.eyes.cascade.xml";
CascadeClassifier eyes_cascade;
std::vector<Rect> eyes;
Mat frame_gray;

for (size_t i = 0; i < eyes.size(); i++){
Point center(eyes[i].x + eyes[i].width*0.5, eyes[i].y + eyes[i].height*0.5);
env->CallStaticVoidMethod(FooClass, mid_getCoord, eyes[i].x, eyes[i].y);

ellipse(frame, center, Size(eyes[i].width*0.5, eyes[i].height*0.5));
Mat eyesROI = frame_gray(eyes[i]);
}

}

做;是否将这两个值(x和y(发送到Java应用程序?*请注意,这些值会不断更改值。

到目前为止我的想法。这就是创建x和y作为全局值,并将它们设置为eyes[i].x和y,然后以某种方式将它们发送到应用程序。。我不确定这是否是正确的方法,我尝试过不同的尝试,但都失败了。。有多个NDK错误,这并不能真正告诉我出了什么问题。。所以我基本上不知道如何解决这个问题。。

感谢您的帮助!

Java类;

public class FooClass {
public native static void eyeDetection(long matRgba);
static void getCoord(int x, int y) {
System.out.println("got coordinates: " + x + ", " + y);
}

我可能在这里做错了什么,但我如何将这些值返回到java应用程序

检测方法运行良好。。这是一些opencv的东西,它在眼睛处画了一个椭圆。。我只需要通过eyes[I].x和eyes[I].y 的坐标

要从本地代码中返回结果,可以在Java中定义一个回调方法。

package com.example.foo;
public class Foo {
public native static void eyeDetection(long addrRgba);
static void getCoord(int x, int y) {
System.out.println("got coordinates: " + x + ", " + y);
// consume the coordinates in Java, e.g.
Foo2.onCreate(x, y);
}
}

 

JNIEXPORT void JNICALL Java_com_example_foo_Foo_eyeDetection(JNIEnv *env, jclass FooClass, jlong matRgba) {
Mat& rgba = *(Mat*)matRgba;
jmethodID mid_getCoord = env->GetStaticMethodID(FooClass, "getCoord", "(II)V");
String eye_cascade_name = "test.eyes.cascade.xml";
CascadeClassifier eyes_cascade;
std::vector<Rect> eyes;
eyes_cascade.detectMultiScale(…);
for (size_t i = 0; i < eyes.size(); i++) {
env->CallStaticVoidMethod(FooClass, mid_getCoord, eyes[i].x, eyes[i].y);
…
}
}

请注意,如果您不想在用于调用eyeDDetection((的线程上执行回调,则必须将该线程附加到JVM(获得一个不同的依赖于线程的JNIEnv指针(,并保留对FooClass的全局引用