JNI for C 使用 Swig 和函数指针回调的问题

2024-02-06

我们在 java 中加载的库之一中有一个 C 函数,它接受一个函数指针

函数定义如下

typedef char int8
typedef unsigned short uint16

uint32 poll_broadcasts(void *(pfn)(int8*,uint16));

在C中使用如下

void handle_broadcasts( int8 *broadcast, uint16 length )

uint32 a = poll_broadcasts( (void*(*)(int8*,uint16)) handle_broadcasts )

但是当您使用 Swig 生成 JNI 包装器时,它会为 poll_broadcast 创建以下定义

public static long poll_broadcasts(SWIGTYPE_p_f_p_char_unsigned_short__p_void pfn) {
    return TestJNI.poll_broadcasts(SWIGTYPE_p_f_p_char_unsigned_short__p_void.getCPtr(pfn));
  }

根据答案
我应该如何编写 .i 文件来包装 Java 或 C# 中的回调 https://stackoverflow.com/questions/12210129/how-should-i-write-the-i-file-to-wrap-callbacks-in-java-or-c-sharp

下面尝试过

test.h

void * data;

typedef void* (*callback_handle_broadcast_t)(int8*, uint16);

static callback_handle_broadcast_t handle_broadcast;

static void set_handle_broadcast(callback_handle_broadcast_t cb, void *userdata) {
    handle_broadcast = cb;
    data = userdata;
}

Swig 接口文件 Test.i

%module Test

%include "cpointer.i"
%include "carrays.i"
%include "various.i"
%include "arrays_java.i"

%pointer_functions(int, intp);
%pointer_functions(char, charp);

%include "arrays_java.i"
%include "typemaps.i"

%{

#include <assert.h>

#include "test.h"

struct callback_data {
  JNIEnv *env;
  jobject obj;
};



void java_callback(int8* arg1, uint16 arg2, void *ptr) {
  struct callback_data *data = ptr;
  const jclass callbackInterfaceClass = (*data->env)->FindClass(data->env, "BroadcastCallback");
  assert(callbackInterfaceClass);
  const jmethodID meth = (*data->env)->GetMethodID(data->env, callbackInterfaceClass, "handle", "([C)V");
  assert(meth);

  jcharArray charArr = (*data->env)->NewCharArray(data->env, arg2);
  (*data->env)->CallVoidMethod(data->env, data->obj, meth, (jcharArray)charArr);

}


%}

%typemap(jstype) callback_handle_broadcast_t cb "BroadcastCallback";
%typemap(jtype) callback_handle_broadcast_t cb "BroadcastCallback";
%typemap(jni) callback_handle_broadcast_t cb "jobject";
%typemap(javain) callback_handle_broadcast_t cb "$javainput";


%typemap(in,numinputs=1) (callback_handle_broadcast_t cb, void *userdata) {
  struct callback_data *data = malloc(sizeof *data);
  data->env = jenv;
  data->obj = JCALL1(NewGlobalRef, jenv, $input);
  JCALL1(DeleteLocalRef, jenv, $input);
  $1 = java_callback;
  $2 = data;
}


%include "test.h"

Java 接口 BrodcastCallback.java

public interface BroadcastCallback {
    //public void handle(String broadcast);
    public void handle(char[] broadcast);
}

实现接口

class BtCallback implements BroadcastCallback {

    @Override
    public void handle(char[] broadcast) {
        LOG.debug("Broadcast callback handled: " + broadcast.length);
    }
}

最后使用时

BroadcastCallback cb = new BtCallback();
Test.set_handle_broadcast(cb, null);
Test.poll_broadcasts(Test.getHandle_broadcast());

没有编译错误,但是当程序运行并且 poll_broadcasts 调用从 java 传递的句柄广播函数指针(在 C 内)时,它会因 EXCEPTION_ACCESS_VIOLATION 崩溃。

看起来它必须对函数的 int8* arg 做一些事情,但无法弄清楚

请有人帮忙。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JNI for C 使用 Swig 和函数指针回调的问题 的相关文章

  • 以编程方式在java的resources/source文件夹中创建文件?

    我有两个资源文件夹 src 这是我的 java 文件 资源 这是我的资源文件 图像 properties 组织在文件夹 包 中 有没有办法以编程方式在该资源文件夹中添加另一个 properties 文件 我尝试过这样的事情 public s
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 如何知道抛出了哪个异常

    我正在对我们的代码库进行审查 有很多这样的陈述 try doSomething catch Exception e 但我想要一种方法来知道 doSomething 抛出了哪个异常 在 doSomething 的实现中没有 throw 语句
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • Cucumber Java 与 Spring Boot 集成 - Spring @Autowired 抛出 NullPointer 异常

    我正在为 Spring boot 应用程序编写 cucumber java 单元测试来测试每个功能 当我与 Spring Boot 集成时 Autowired 类抛出 NullPointer 异常 Spring Boot应用程序类 Spri
  • 我可以创建自定义 java.* 包吗?

    我可以创建一个与预定义包同名的自己的包吗在Java中 比如java lang 如果是这样 结果会怎样 这难道不能让我访问该包的受保护的成员 如果不是 是什么阻止我这样做 No java lang被禁止 安全管理器不允许 自定义 类java
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • javafx android 中的文本字段和组合框问题

    我在简单的 javafx android 应用程序中遇到问题 问题是我使用 gradle javafxmobile plugin 在 netbeans ide 中构建了非常简单的应用程序 其中包含一些文本字段和组合框 我在 android
  • Eclipse 中 Spring MVC 模型对象的 (jsp /jstl) 视图中的代码辅助

    在 Spring MVC 中 当将对象放置在视图模型中时 如下所示 public String getUser Model model fetch user model addAttribute user user return viewN
  • 具有特定参数的 Spring AOP 切入点

    我需要创建一个我觉得很难描述的方面 所以让我指出一下想法 com x y 包 或任何子包 中的任何方法 一个方法参数是接口 javax portlet PortletRequest 的实现 该方法中可能有更多参数 它们可以是任何顺序 我需要
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 带元胞数组的 Matlab 动态字段名结构

    我如何使用动态字段名访问以下结构路径 var refxtree CaseDefinition FlowSheetObjects MaterialStreamObjects 8 MaterialStreamObjectParams Press
  • 在使用 Jest 进行测试之前等待 React 组件状态更新

    我有一个组件handleAdd功能 该函数调用一个库 该库又调用axios并返回一个承诺 一旦解决了这个问题 handleAdd 方法更新组件状态 进而渲染子组件 换句话说 它首先检查服务器以确保在本地显示该项目之前已添加该项目 使用 Je
  • Python3 将所有字符转换为 HTML 实体

    我正在使用Python3 我想知道是否有一个模块或默认函数可以将文本的所有字符转换为html实体 甚至字母和数字 因为我不想为此制作翻译映射 解决了 正如 justhalf 告诉我的 我通过创建这个函数找到了解决方案 def htmlEnt
  • 如何修复“对象不是此领域架构的一部分”

    我正在尝试设置一个使用Realm数据库 但我似乎无法使其工作 我也禁用了Instant Run但这也没有解决问题 这是我的代码文件 应用程序级别的build gradle apply plugin com android applicati
  • 如何在 OMNeT++ 中创建随机连接图?

    我正在尝试创建一个具有随机连接节点的图 节点应该随机连接 如果一个节点已经连接到另一个节点 则不应使用不同的连接再次连接到同一节点inout port 在文档中 https doc omnetpp org omnetpp manual se
  • 如何用c语言编写一个简单的malloc函数

    作为操作系统的作业 我们必须用 C 编程语言编写自己的 malloc 和 free 代码 我知道如果我要求它的代码 我就没有必要学习 我面临的问题是不知道在哪里包含初始化 50000 字节的 char 数组并使两个列表空闲和使用 在我的函数
  • 如何生成动态数组

    我必须生成一个动态菜单来从数据库中获取数据并将结果存储在动态数组中 如何在 php 中实现这一点 PHP 中的数组默认是动态的 只需向其中添加更多项目即可 如本例所示 假设数据库为MYSQL result mysql query menu
  • json.decode() 输入意外结束(在字符 1 处)

    我在登录用户时遇到了 flutter 中的匿名关闭错误 前几天还可以 但现在不行了 不知道为什么 所以请提前提供帮助和感谢 每当我填写详细信息并点击登录按钮时 它都会抛出以下错误 E flutter 2914 ERROR flutter s
  • 如何使用 ReactJS 嵌入 Gist

    我正在尝试使用 ReactJS 嵌入 Gist 但出现以下错误 无法对 文档 执行 写入 除非显式打开 否则无法从异步加载的外部脚本写入文档 这是我的组件 var EmbeddedGist React createClass render
  • 需要从 webapp 执行 shell 脚本并在页面中显示控制台输出

    我正在寻找 java 示例或库来帮助我将其集成到 Struts2 Spring 应用程序中 许多构建系统 例如 Luntbuild 或 Hudson 都具有此功能 我想在我尝试从其中一个示例中挖掘它之前 我想我会问是否有人知道一个独立的示例
  • 即使链接器可以找到该库,为什么我也会收到“DSO 丢失”错误?

    我正在针对我编写的共享库编译一个程序 这个库又依赖于Boost program options 以及其他图书馆 当我编译程序时 我当然需要提及我的库 但我收到 DSO 错误 g ism create conf cc o ism create
  • 如何在pyqt中检查复选框是否被选中

    我试图根据是否选中复选框来制作条件语句 我尝试过类似以下的操作 但它总是返回 true self folderactive QtGui QCheckBox self folders self folderactive setGeometry
  • 阻止自动保留,是否会影响 self 中的 ivars?

    如果我有课 interface A NSObject BOOL b id c end 和参考b and c在一个块中 是块保留self自动地 要不就b and c About c 它可能会被保留 但是怎么样b 比尔的回答不太正确 如果你有一
  • 使用 cURL 将表单 POST 到两个地方

    昨天我问了一个问题 https stackoverflow com questions 12165649 how can i execute php before posting to someone elses script from a
  • JSP处理指令未关闭

    我试图将 HTML 文件包含到我的 JSP 中 但我的 Eclipse 显示了此错误 包含的文件 和错误 Processing instruction not closed 这只是简单的 JSP
  • 删除这个 Seaborn 人物中产生的两个传说之一?

    我刚刚开始使用seaborn 来制作我的人物 然而我似乎无法删除这里产生的传说之一 我正在尝试绘制两个相互对比的准确度 并沿着对角线画一条线 以便更容易地看到哪个表现更好 如果有人有更好的方法在seaborn中绘制这些数据 请告诉我 我想保
  • 如何在mailchimp中设置日期区域设置?

    我需要更改 mailchimp 区域设置 DATE M y 这给出了 Apr 2013 我想要 Abr 2013 葡萄牙语格式 有什么办法可以做到这一点吗 Thanks 您是否尝试过用翻译合并标签包装日期 TRANSLATE PT DATE
  • 防止链接按钮回发 OnClientClick 不起作用。为什么?

    我知道围绕这个主题有很多答案 但我就是无法让它发挥作用 我需要防止链接按钮发回 并且以下代码不起作用 该代码肯定在所有需要的地方都被击中了 链接按钮定义
  • 无法为 nlb 提供静态 IP

    我很难使用入口控制器将其与 NLB 一起使用 https kubernetes github io ingress nginx deploy network load balancer nlb https kubernetes github
  • JNI for C 使用 Swig 和函数指针回调的问题

    我们在 java 中加载的库之一中有一个 C 函数 它接受一个函数指针 函数定义如下 typedef char int8 typedef unsigned short uint16 uint32 poll broadcasts void p