JNI运行进程而不是使用库

时间:2015-05-18 20:22:58

标签: java c++ opencv java-native-interface

我运行了一些图像识别软件来为我的游戏生成输入。 我通过C ++中的openCV检测运动,但是一个约束是游戏本身应该用java编写。我想查询openCV进程的状态以获取一些输入对象。我想通过JNI调用我的运行进程来做到这一点,但是所有JNI示例都只调用库函数,而不是运行进程。这可能是通过JNI还是我被迫使用套接字?

1 个答案:

答案 0 :(得分:1)

您可以从C ++调用JVM,初始化基于openCV的组件,然后运行java代码。

调用基础知识here, with a sample snippet。有关通过静态方法启动Java组件的示例,您可以查看the end of this SO answer处的代码。

最后,为了调用C ++监视函数,必须在java代码中使用本机方法,并为其注册c ++函数。然后,此函数可以访问您在初始化期间准备的所示例:

在Java中:

class MyTest {
    ...
    public native void doMonitor();  // to be supplied in C++ trhough JNI 
}

在C ++中,初始化代码中的某个位置(在启动Java代码之前),您必须注册本机方法:

    jclass cls2 = env->FindClass("MyTest");
    JNINativeMethod methods[] { { "doMonitor", "()V", (void *)&doMonitorCPP } };
    if(env->RegisterNatives(cls2, methods, 1) < 0)
    {
        if(env->ExceptionOccurred())
            cerr << " OOOOOPS: exception when registreing natives" << endl; 
        else
            cerr << " ERROR: problem when registreing naives" << endl;
    }

doMonitor()将被定义为例如:

void doMonitorCPP(JNIEnv*e, jobject o) {
    std::cout << "C++callback activated" << std::endl;
    // do what you need to do with openCV. 
}