gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:35:49 25 4
gpt4 key购买 nike

所以我有这个 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

最佳答案

要从您的 native 代码中获取结果,您可以在 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);

}
}

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

关于java - JNI - Java 应用程序的 C++ 变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51468254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com