sách gpt4 ai đã đi

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

In lại 作者:太空宇宙 更新时间:2023-11-04 03:04:59 34 4
mua khóa gpt4 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 中分配。

Ví dụ:

định nghĩa kiểu cấu trúc {
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);
}

1 Câu trả lời

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

我的回调有效并实现为:

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/

34 4 0
Bài viết được đề xuất: javascript - 发送动态变量到jquery
Bài viết được đề xuất: javascript - 单击按钮将其文本添加到另一个 div
Bài viết được đề xuất: html - 如果父元素不是全屏宽度,如何使子菜单跨越全屏?
Bài viết được đề xuất: css - 顶部内部透明箭头
太空宇宙
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com