java - 从 C++ 回调 Java 方法

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

这是我的情况,有点复杂,但必须是这样。我正在实现一个 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/

相关文章:

java - 在java应用程序中抽象出属性文件的硬编码路径名的可能方法

c++ - Visual Studio C++ "Multithreaded Debug DLL"与 "Multithreaded DLL"

c++ - header 中包含 "std::cout"的非静态成员引用

java - Android NDK 中的 JNI 清理和守护线程

java - JNI 缓存的 jclass 全局引用变量被垃圾收集?

java - 无法在 cpanel+tomcat 中运行 servlet

未找到 Java 符号

android - 我将使用什么 OpenCv 函数来检测在 Android 上实现的叶子中的疾病

java - 从 jsp 读取 xml

c++ - Winsock2 - 如何在客户端使用 IOCP