2011-06-20 36 views
1

我在 registering java function as a callback in C function遵循的建議,可以與「簡單」類型,如整型和字符串,如回調:JNI回調適用於Java類型,而不是C型

jstring js = (*env)->NewStringUTF(env, "hello"); 
(*env)->CallStaticVoidMethod(env, cls, methodid, js); 

但是,如果我試圖用已經用SWIG包裝的C數據類型做同樣的事情,我只在Java中獲得空指針。在C部分,他們絕對不是0.他們需要被區別對待嗎?

[編輯:] 一些詳細信息:

如上所述,字符* /字符串工作對我來說也是如此。我正在尋找C struct的解決方案,這些解決方案已經被SWIG包裝並且已經用Java分配。

如:

typedef struct { 
    unsigned short length; 
    unsigned short value; 
} lv_t; 

是越來越受痛飲包裹,這樣我就可以在Java中使用它:

lv_t lv; 
lv = modulename.modulename_new_lv(); 
lv.setLength(1); 
lv.setValue(2); 

這樣,我就把這個結構從Java到C:

modulename.send(lv); 

C會通過網絡發送它,收到一些回覆並更改lv中的值。現在,這應該將修改後的lv返回給Java。

void jni_call_received_hook(lv_t* lv){ 
    JNIEnv* m_env; 
    (*m_vm)->AttachCurrentThread(m_vm, (void**) &m_env, NULL); 
    jclass cls = (*m_env)->FindClass(m_env, "gui/StateMachine"); 
    jmethodID mid = (*m_env)->GetStaticMethodID(m_env, cls, "callReceivedEvent", "(Lcom/something/modulename/jni/lv_t;)V"); 
    if (mid == 0){ 
     log(E, "Unable to find method for callback"); 
     return; 
    } 

    // what to do here to create a jobject? 
    jobject lv_j = ...; 

    (*m_env)->CallStaticVoidMethod(m_env, cls, mid, lv_j); 

}

的呼叫:

public static void messageHandler(lv_t lv) { 
    System.out.println("messageHandler()."); 
    System.out.println("lv " + lv); 
} 

回答

2

很抱歉,但我不能在你的問題還沒有發表評論,所以這更多的是評論,而不是答案。無論如何,我最近做了這樣的事情。

我的回調工程和實現爲:

void jni_call_received_hook(char* username){ 
JNIEnv* m_env; 
(*m_vm)->AttachCurrentThread(m_vm, (void**) &m_env, NULL); 
jclass cls = (*m_env)->FindClass(m_env, "gui/StateMachine"); 
jmethodID mid = (*m_env)->GetStaticMethodID(m_env, cls, "callReceivedEvent", "(Ljava/lang/String;)V"); 
if (mid == 0){ 
    log(E, "Unable to find method for callback"); 
    return; 
} 
(*m_env)->CallStaticVoidMethod(m_env, cls, mid, (*m_env)->NewStringUTF(m_env, username)); 
} 

變量m_vm是JVM的一個實例,我已經把在調用時註冊該回調的方法是這樣的:

JNIEXPORT void JNICALL Java_gui_StateMachine_setCallReceivedCallback(JNIEnv *e, jobject o){ 
(*e)->GetJavaVM(e, &m_vm); 
set_call_received_hook(jni_call_received_hook); 
} 

也許你錯過了一些東西。讓我知道如果這不夠清楚。希望能幫助到你。

+0

在C結構和調用鏈上添加更多細節。 – mab

+0

真棒,迄今爲止最好的回調示例 – Houston