2015-05-18 2 views
1

У меня есть программное обеспечение для распознавания изображений, работающее для создания ввода для моей игры. Я обнаруживаю движения через openCV в C++, однако ограничение состоит в том, что сама игра должна быть записана в java.I хотелось бы запросить состояние процесса openCV, чтобы получить некоторые объекты для ввода. Я хотел сделать это через JNI-запросы на мой текущий процесс, но все примеры JNI просто называют функции библиотеки, а не запущенным процессом. так это возможно через JNI, или я вынужден использовать сокеты для этого?JNI для запуска процесса вместо использования библиотеки

+0

Я действительно не понимаю, что «JNI для моего процесса» меня ans - если вы хотите выполнить межпроцессный вызов, вам нужно использовать IPC (например, сокеты). Похоже, у вас есть хороший ответ, так что, может быть, вы можете попросить ответчика изменить свой вопрос, чтобы он стал яснее? –

ответ

1

Вы можете вызвать JVM из C++, инициализировать компоненты на основе 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. 
} 
+0

Удивительный мужчина, спасибо тонну! –

Смежные вопросы