从c ++回调Java方法

时间:2010-08-06 22:03:09

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

这是我的情况,它有点复杂,但必须是这样的。我正在使用Java实现一个程序,它使用JNative打开一个应用程序。该应用程序是用C ++编写的。但是当应用程序完成后,我希望它回调到Java以让Java知道运行完成。我可以这样做吗?我知道我应该使用JNI,但我没有找到相关的例子。感谢。

1 个答案:

答案 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工具生成方法签名,以便您可以调用它们。