JNI – 如何从C ++或C回调到Java?

我有Java应用程序调用本机C ++ / C代码。 C ++ / C代码需要回调到Java。 你能给我一些如何做到这一点的例子。

有很多有效的方法可以从C / C ++回调到Java。 我将向您展示一种使用C(易于调整C ++的env)的技术,这使得将数据从本机代码传递到Java代码变得相当容易。 此示例传递字符串(易于修改任何数据类型)。

在本机代码中,创建以下内容:

// Globals static jmethodID midStr; static char * sigStr = "(Ljava/lang/String;ILjava/lang/String;)V"; // Init - One time to initialize the method id, (use an init() function) midStr = (*env)->GetMethodID(env, class, "javaDefineString", sigStr); // Methods static void javaDefineString(JNIEnv * env, jobject o, char * name, jint index, char * value) { jstring string = (*env)->NewStringUTF(env, name); (*env)->CallVoidMethod(env, o, midStr, string, index, (*env)->NewStringUTF(env, value)); } 

在Java代码中创建以下内容:

 Map strings = new HashMap(); // Never call this from Java void javaDefineString(String name, int index, String value) { String key = name + "." + index; strings.put(key, value); } 

发送数据的本机用法:

 javaDefineString(env, o, "Greet", 0, "Hello from native code"); javaDefineString(env, o, "KeyTimeout", 0, "one second"); javaDefineString(env, o, "KeyTimeout", 1, "two second"); 

用于接收数据的Java用法:

 System.out.println(strings.get("Greet.0"); System.out.println(strings.get("KeyTimeout.0"); System.out.println(strings.get("KeyTimeout.1");