如何使用JNI从本机C/ c++代码调用Java applet回调函数

How to call a Java applet callback function from native C/C++ code using JNI.

本文关键字:调用 代码 Java applet 函数 回调 c++ JNI 何使用 本机      更新时间:2023-10-16

如何使用JNI从本地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的

回调当然可以完成,但我认为它们增加了不必要的复杂性。使用上面的方法,你可以把东西更好地分开。