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);
}
在C結構和調用鏈上添加更多細節。 – mab
真棒,迄今爲止最好的回調示例 – Houston