簡體   English   中英

如何使用JNI從本機C / C ++代碼調用Java applet回調函數。

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

如何使用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 ++函數,該函數在條件變量(或類似變量,取決於您的OS)上阻塞,直到准備好返回響應為止。
  • 當您要調用回調時,讓上面的C ++函數具有數據並向condition變量發出信號。 然后它可以返回數據。

當然可以通過JNI進行回調,但是我認為它們會增加不必要的復雜性。 使用上述方法,您可以使IMHO保持更好的分隔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM