Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/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
JNI-c++;Java应用程序的变量值_Java_Android_C++_Java Native Interface - Fatal编程技术网

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

JNI-c++;Java应用程序的变量值,java,android,c++,java-native-interface,Java,Android,C++,Java Native Interface,我有一个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(FooCl

我有一个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]);
}
我可能在这里做错了什么,但是如何将这些值返回给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_示例_foo_foo_eyeDetection(JNIEnv*env,jclass FooClass,jlong matRgba){
Mat&rgba=*(Mat*)matRgba;
jmethodID mid_getCoord=env->GetStaticMethodID(FooClass,“getCoord”,II)V);
字符串eye\u cascade\u name=“test.eyes.cascade.xml”;
级联效应;
性病媒眼;
眼睛级联检测多尺度(…);
对于(size_t i=0;iCallStaticVoidMethod(FooClass,mid_getCoord,eyes[i].x,eyes[i].y);
…
}
}

请注意,如果您不希望在用于调用eyeDetection()的线程上执行回调,则必须将该线程附加到JVM(获取一个不同的依赖于线程的JNIEnv指针),并保留对FooClass的全局引用,因为您的代码不完整,如果for循环中的vector
cubes
是空的(您刚刚创建了它),您如何才能在其中取消引用它?是的,我没有提供整个colde,我认为只要有这个想法就足够了。请注意,这些值不断地改变值。是否要返回for循环中生成的每个
x
y
?不清楚“应用程序”是什么意思。你说的是哪一类?调用
foo
的是同一个类吗?您是想调用该类中的某个方法,还是打算直接写入其字段?
foo
需要是静态的还是实例方法?pbn:是的,循环不断改变值,需要立即发送到应用程序(java)中。。。Micheal:是的,比如说公共本机静态voidfoo(intx,inty);该方法用于显示java类中的一些x和y值。。我要试试这个它必须与eyeDetection()位于同一线程中,因为这是公开坐标的线程;是否公开本机静态void getCoord(intx,inty)?不,这是一个Java方法,它使用
x,y
来绘制或执行任何操作。这就是为什么我相信你可能会发现它毕竟必须使用一个单独的线程。那么数据不会不同步吗?我的意思是,假设在detect()eyes[I].x中,eyes[I].y=(30,60),在一纳秒内它会变为(40,80),我可能会丢失线程2中的一些数据(getCoords),因为线程是异步的,不知道何时进行回调?您可以直接从本机代码调用任何类的任何静态方法。如果有对Java对象的引用,也可以调用它的非静态方法。不过,为了尽可能简单,请在Foo类中执行此操作。
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);
    …
  }
}