这是我的情况,它有点复杂,但必须是这样的。我正在使用Java实现一个程序,它使用JNative打开一个应用程序。该应用程序是用C ++编写的。但是当应用程序完成后,我希望它回调到Java以让Java知道运行完成。我可以这样做吗?我知道我应该使用JNI,但我没有找到相关的例子。感谢。
答案 0 :(得分:1)
通过“打开应用程序”,您的意思是启动外部进程,还是进行库调用?
如果您刚刚启动可执行文件,则可以使用Runtime.getRuntime().exec
启动该进程,并使用返回的进程句柄从进程中获取返回代码。您还可以使用getInputStream
从您启动的流程中捕获流程的输出。
但是,如果您实际上正在调用C进程,那么是的,JNI将是首选解决方案。你可以在这里找到关于JNI回调Java对象的好教程:http://journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementing/method.html
教程中的关键是:
JNIEXPORT void JNICALL
Java_Callbacks_nativeMethod(JNIEnv *env, jobject obj, jint depth)
{
jclass cls = (*env)->GetObjectClass(env, obj);
jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "(I)V");
if (mid == 0)
return;
printf("In C, depth = %d, about to enter Java\n", depth);
(*env)->CallVoidMethod(env, obj, mid, depth);
printf("In C, depth = %d, back from Java\n", depth);
}
简而言之,从C开始,您需要先获取该方法,然后才能调用它。您还可以使用javap工具生成方法签名,以便您可以调用它们。