Java应用程序的JNI-c++变量值
JNI - c++ variable value to Java-application
所以我有一个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 的坐标
要从本地代码中返回结果,可以在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);
…
}
}
请注意,如果您不想在用于调用eyeDDetection((的线程上执行回调,则必须将该线程附加到JVM(获得一个不同的依赖于线程的JNIEnv指针(,并保留对FooClass的全局引用。
相关文章:
- 使用变量值作为 PlaySound 中的路径
- 通过指针偏移量访问结构变量值
- 变量值在 C++ 中的 glutIdleFunc() 中未递增
- 更新 #ifdef 中的现有变量值?
- 尝试更改 main 函数内的全局变量值时出现编译错误 C++.
- 通过 Rcpp 和 bit64 R 包将最大的int64_t变量值从 C++ 传递到 R
- 如何使用 IRBuilder 更新 LLVM IR 中的全局变量值?
- 更改已在运行的程序的变量值
- 在 Xcode 中使用后对外部变量值进行初始化
- C++整数变量值
- 变量值,在三元运算符之后
- 如何获得对不同类的引用,以便从所述类内部获得变量值
- Java应用程序的JNI-c++变量值
- 如何固定从传感器获得的变量值
- 离开方法时重置变量值
- 打印具有通用特定变量值的类对象
- 在宏函数C++中设置宏变量值
- 为什么每次迭代都会获得相同的变量值? C++
- 如何根据基类对象中的变量值分配派生类中的变量?
- 如何将全局字符变量值分配给数组?