gpt4 book ai didi

c - jni 回调适用于 java 类型,但不适用于 c 类型

转载 作者:太空宇宙 更新时间:2023-11-04 03:04:59 26 4
gpt4 key购买 nike

我听从了建议 registering java function as a callback in C function并且可以使用“简单”类型(例如整数和字符串)进行回调,例如:

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

但是,如果我尝试对用 SWIG 包装的 C 数据类型执行相同的操作,我只会在 Java 中获得空指针。 C部分肯定不是0,需要区别对待吗?

[编辑:]更多信息:

如上所述,char*/string 也适用于我。我正在寻找 C 结构的解决方案,它已被 SWIG 包装并已在 Java 中分配。

例如:

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

正在被 SWIG 包装,所以我可以在 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);
}

最佳答案

抱歉,我还不能对你的问题发表评论,所以这更像是评论而不是答案。无论如何,我最近做了类似的事情。

我的回调有效并实现为:

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);
}

也许你错过了什么。如果这还不够清楚,请告诉我。希望对您有所帮助。

关于c - jni 回调适用于 java 类型,但不适用于 c 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6411829/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com