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