java - 如何使用 JNI 从 native C/C++ 代码调用 Java applet 回调函数。

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

如何使用 JNI 从 native C/C++ 代码调用 Java applet 回调函数。请让我知道如何正确完成此操作。请任何代码片段都会有帮助。

// Java Applet code

public class TestApp extends Applet {

    private native void TestMethod(int nValue);

    public void callback(int nValue) {
            // DISPLAY SOME MESSAGE FROM NATIVE DLL RECEIVED

    }

     static {
        System.load("c/temp/TestDll.dll");
  }
}

//TestDll.cpp

JNIEnv *g_env;
jobject g_object;
jmethodID g_method;




   JNIEXPORT void JNICALL
    Java_Callbacks_TestMethod(JNIEnv *env, jobject obj, jint Value)
    {
        jclass cls = (*env)->GetObjectClass(env, obj);
        jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "(I)V");      

        g_env = env;
        g_Object = obj;
        g_method = mid
    }

        // Cannot be called within the above function
    void TestDllCallbackFunction (int nValue)
    {

            // This is where i want to call the Java callback function… would the below work???
        (*g_env)->CallVoidMethod(g_env, g_object, g_method, ((jint)Value);
    }

最佳答案

您还应该考虑另一种解决方案作为从 C++ 到 Java 的回调的替代方案:

  • 创建一个额外的 Java 线程来等待 C++ 的响应
  • 让该 Java 线程调用一个 C++ 函数,该函数会在条件变量(或类似变量,具体取决于您的操作系统)上阻塞,直到准备好返回响应为止。
  • 当您想要调用回调时,让上述 C++ 函数拥有数据并向条件变量发出信号。然后就可以返回数据了。

通过 JNI 的回调当然可以完成,但我认为它们增加了不必要的复杂性。使用上述方法,您可以使事情更好地分开恕我直言。

关于java - 如何使用 JNI 从 native C/C++ 代码调用 Java applet 回调函数。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7992039/

相关文章:

java - 获取两个文本的相似度百分比

c++ - 如何使 is_arithmetic<myClass>::value 为真?

c++ - 最小化 boost::spirit 编译时间

c - c语言打印分隔符

C程序删除字符串中重复的字符

java - MVC 中所有 Controller 的通用业务服务层

java - 安全 EJB3.1-Web 服务(在 JBoss Wildfly 8.2 中)

c - 使用动态数组按字母顺序对单词进行排序

java - 在 JavaFX 中更新 TableCell 时的奇怪行为

c++ - 我可以使用像 bool 这样的数据类型来压缩数据同时提高可读性吗?