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

标签 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(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/

相关文章:

java - Android SQL 数据库错误(代码 1)

java - Selenium 多浏览器测试。只有最后一个浏览器会收到 cookie。测试NG

c++ - Resource.rc 文件中返回多个资源

java - 在 Java 中插入 SQL 后访问自动递增标识字段

java - Android - 如何检测屏幕上的触摸是 "scroll"触摸?

android - ionic 2 : Add platform doesn't work

Android onItemSelected 空指针异常

javascript - 在 android chrome 中自动播放 html5 视频

c++ - 向 std::cout 添加 "prompt"消息的最佳方法

c++ - 错误 C2064 : term does not evaluate to a function taking 0 arguments