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

时间:2011-11-03 08:37:59

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

如何使用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);
    }

1 个答案:

答案 0 :(得分:0)

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

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

肯定可以通过JNI进行回调,但我认为它们会增加不必要的复杂性。使用上面的方法,你可以把事情更好地分开恕我直言。