2009-09-07 47 views
4

有沒有任何方法可以將回調傳遞給來自C的java代碼,並且調用立即返回。稍後,完成任務後,java代碼可以調用該回調。jni中的回調

我有一個C的擴展名爲php,調用一個java商店來存儲一些項目。這些項目可以通過同步和異步方法從商店中獲取(我向商店提供了密鑰列表和回調,並且它會調用回調並返回其中的項目)。

我能夠從擴展同步檢索項目,但現在我不知道如何異步做到這一點。

  • 有沒有什麼辦法可以讓我的C代碼提供一個指向java可以稍後調用的函數的指針?
  • 或者是否有可能我每次創建一個java線程C代碼要求異步檢索項目,然後java線程調用一個C函數,可以將項目返回給用戶?

作爲最後的手段我可能必須創建在C代碼線程,該線程,它可以從Java檢索排隊鍵。

或者zend中是否有任何支持,允許我排隊執行任務,以及zend可以爲隊列中的每個任務逐一調用的回調?

回答

4

Java調用C函數的方式是本地類方法。只需在java中創建一些類(可能實現您的回調接口),它就具有本地方法。編譯並使用JDK中的javah工具進行處理 - 這會創建包含函數簽名的頭文件。然後你可以在你的本地代碼中實現這個功能。

當您需要提供回調時 - 通過NewObject()創建此類的新實例並傳遞給java代碼。

+0

這個本地函數調用會給我一個有效的JniEnv指針,這個指針已經被C程序加載了嗎? 創建類的新實例並將其傳遞給java很重要嗎? 你能否提供一些示例代碼。 – ata 2009-09-08 18:42:33

+0

例如函數聲明本地int回調(字符串);將具有C簽名jint Java_com_mypackage_MyClass_callback(JNIEnv * env,jobject class_instance,jstring參數) - 您有env,指向具有回調和所有參數的類的指針。我會盡力在稍後提供示例代碼 – Xeor 2009-09-08 23:45:57