这是我的情况,有点复杂,但必须是这样。我正在实现一个 Java 程序,该程序使用 JNative 打开应用程序。该应用程序是用 C++ 编写的。但是当应用程序完成时,我希望它回调到 Java,让 Java 知道运行已完成。我可以这样做以及如何做?我知道我应该使用 JNI,但我没有找到相关示例。谢谢。
最佳答案
“打开应用程序”是指启动外部进程,还是进行库调用?
如果您只是启动可执行文件,则可以使用 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工具生成方法签名,以便您可以调用它们。
关于java - 从 C++ 回调 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3428125/