java - 如何使用 JNI 从通过调用 API 启动的 Java 应用程序将数据发送回 C 应用程序?

标签 java c java-native-interface

我有一个作为 GUI 的 Java 应用程序,通过 Invocation API 启动对于C

MyApp.c -> Main application - compiled to MyApp
MyGUI.java -> Java GUI launched programmatically from the C main application - compiled to MyGUI.class
MyGUI_Print.c -> holds JNI method for testing purpose, called from Java GUI - compiled to libMyGUI_Print.so

主 C (MyApp) 文件如下所示:

 #include <jni.h>   
//...
JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
//...
(*env)->CallStaticVoidMethod(env, cls, mid, args);

最后一行方法调用使我能够将数据从 C 发送到以编程方式启动的 Java GUI。但是如何从 Java 将数据( boolean 值或字符串)发送回实际的 C 应用程序 (MyApp) - 假设单击 Java GUI 中的按钮?

很明显,我可以通过 JNI 从 Java 中调用 C 方法。 Java GUI 应用程序 (MyGUI) 用于测试目的:

private native void print();
static {
   System.loadLibrary("MyGUI_Print");
}

但是相应的C文件必须编译为so/dll文件,所以我当然在这个库文件(MyGUI_Print)和我需要数据的实际C程序(MyApp)之间没有任何联系。从MyGUI_Print我但是我能够像这样打印:

#include <jni.h>
#include <stdio.h>
#include "MyGUI.h"

JNIEXPORT void JNICALL Java_MyGUI_print (JNIEnv *env, jobject obj)
{
    printf("Hello World!");
    fflush(stdout);
}

此输出也会到达实际的 C 应用程序的控制台输出。但到目前为止,C 应用程序本身并不了解“传入”数据。我可以通过什么方式在另一端(C 应用程序)以编程方式访问该字符串?或者有什么更好的解决办法吗?

理论上,我当然可以进行轮询 - 即每隔几秒向 C 应用程序询问 Java 环境中某些变量的当前状态。但我认为这不是一个好的方法。

最佳答案

实际上,您的可执行文件和假设的 JNI 库之间确实存在连接。它们位于同一进程中,因此您始终可以将一些句柄从 C 代码传递到 Java 代码,然后从 Java 代码传递到 JNI 库中的 C 代码。该库可以使用它来调用主模块中的内容。

也就是说,我会完全跳过 JNI 部分。您可以将函数地址传递给 Java,然后使用 JNA (https://github.com/java-native-access/jna) 来调用该函数。它在内部使用 libffi。

(如果您不想传递函数指针,JNA 还可以帮助您获取函数所在位置的模块句柄,然后通过函数名称获取函数)

关于java - 如何使用 JNI 从通过调用 API 启动的 Java 应用程序将数据发送回 C 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47683406/

相关文章:

java - Pyspark:异常:Java 网关进程在向驱动程序发送其端口号之前退出

objective-c - 使用 SUN RPC 将文件从客户端传输到服务器

c - 用于更新指向未知维度的二维数组的指针的原型(prototype)

java - 从JNI中的jclass获取jobobject

java - 在 Linux 终端中编译项目不起作用

java - 从 S3 下载大于 3Gb 的文件失败并显示 "SocketTimeoutException: Read timed out"

java - 你能在 Android/eclipse 中有#regions吗

java - 导致 POST 请求主体变空的过滤器

c - 将未绑定(bind)的值排序到绑定(bind)的范围内?

android ndk mupdf构建错误