在C函数中注册Java功能为回调

 2023-01-20    262  

问题描述

我正在尝试使用SWIG 1.3在Java中实现一些C代码.现在我
必须将一些现有的C重建为Java代码并提供功能
指向java函数到C方法.

C代码:
net.c:

在C函数中注册Java功能为回调

void register_message_handler( context_t *ctx, message_handler_t handler) {
context->msg_handler = (void (*)( void *, coap_queue_t *, void *)) handler;
}

客户端:

void message_handler(context_t  *ctx, queue_t *node, void *data) {
...
}

int main(int argc, char **argv) {
// setup ctx
register_message_handler( ctx, message_handler );
}

我在Java中已经拥有的只是:

public static void message_handler(def.SWIGTYPE_p_context_t ctx, def.SWIGTYPE_p_queue_t node, String data ) {}

,应以与在
上面的C代码,现在在Java中:

net.register_message_handler(ctx, message_handler);

我发现的是
swig_nn30 包括
本章末尾的未定义参考:
“现在,关于功能指针支持的最后说明.尽管SWIG没有
通常允许以目标语言编写回调函数
可以通过使用类型和其他高级SWIG功能来完成.
这在后面的一章中进行了描述.”
这是在哪里指的?

我还找到了C ++的解决方案,但是有没有办法将其适应C?
swig c ++ w/java w/java w/java type type typer typer typer typer typer typer typer typer typer typer typer typer typer typer typer typer typer typer ty
形态呼叫式功能

感谢您的帮助.

推荐答案

我记得在SWIG手册中也挠头.

您可以如下执行此操作,而无需深奥的功能:

  • 您需要一种机制来将传入的C回调发送到Java中.为此,您需要所调用的对象的对象ID以及处理程序的方法ID.在您的C注册助手中,为这些人创建全局参考,并缓存它们以供回调.

  • 您还需要一个类ID和构造函数方法ID,以作为要将Java回调作为参数传递给Java回调的任何内容.您还想将全球引用缓存到这些引用.

  • 在回调的C部分中,查找方法ID,构造参数并调用Java.

  • 回调的线程需要连接到Java VM(带有JNI函数tactercurrentthread()).这是您从那里获得JNIENV指针的地方.该指针仅在您调用artedCurrentThread()的线程的上下文中有效!这意味着,如果您在多个线程上有回调,则需要在线程本地存储中缓存Jnienv *.

  • 确保从JNI函数返回后检查返回值

  • 确保在任何呼叫回到Java之后检查异常情况().不这样做真的会让您遇到麻烦.

  • 我发现这种相对易于调试,如以下内容:从eclipse启动主Java程序,将Visual Studio Debugger附加到该过程.您可以在任一侧设置断点.

以上所述是小编给大家介绍的在C函数中注册Java功能为回调,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26146.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。