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