所以我有这个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作为全局值,并将它们设置为yesi.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的东西,它在眼睛上画了一个椭圆..我只需要传递Eysi.x和Eysi.y的坐标
发布于 2018-07-23 05:12:56
要从本机代码中获取结果,可以在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的全局引用。
https://stackoverflow.com/questions/51468254
复制相似问题