首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java应用程序的JNI - c++变量值

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

Stack Overflow用户
提问于 2018-07-23 02:49:12
回答 1查看 710关注 0票数 0

所以我有这个JNI函数,它给了我一些x和y的值。我想要将值发送到java应用程序,但由于它是一个JNICall,我不知道该如何做?

代码语言:javascript
复制
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类;

代码语言:javascript
复制
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的坐标

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-23 05:12:56

要从本机代码中获取结果,可以在Java中定义一个回调方法。

代码语言:javascript
复制
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);
    }
}
代码语言:javascript
复制
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的全局引用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51468254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档