当前位置: 首页 > 知识库问答 >
问题:

C以指针为参数的函数,并使用Swig界面进行处理

凌远
2023-03-14

我已经创建了swig接口文件来为我的C文件创建JNI。但是我的一些C文件包含一些函数,这些函数接受指针作为参数,比如(void*),C BOOL和Swig将其转换为SWIGTYPE_p_int32_t如何从java传递这种数据类型?

例如,函数的一个实际原型在C中如下所示

DLL_API void DLL_CALLCONV FreeImage_Initialise(BOOL load_local_plugins_only FI_DEFAULT(FALSE));

它通过swig转换成Java文件

public static void FreeImage_Initialise(SWIGTYPE_p_int32_t load_local_plugins_only)

如何从java传递这样的值?

我有许多类在函数中包含此类参数。有什么方法可以让我尽可能简单地将解决方案应用于处理数据类型的批量文件。

我读过这样做的一种方法是创建帮助函数,但我不能这样做,因为我有很多c类,对于每个函数,创建用于返回指针的帮助函数并不是一个好办法。

如果可能,请建议任何其他方式。

共有3个答案

贾俊艾
2023-03-14

这是因为BOOLtype的奇怪声明。

在这种特殊情况下,您可以从Java侧传递一个int在那里。01都将完成正确的工作。

或者,通过为这个库创建一个小包装器,您可以在本机代码中将BOOL更改为BOOL

东郭和光
2023-03-14

关于布尔函数,我建议使用bool而不是bool,因为JNI直接为它提供了一个类型签名:Z(您可以在以下位置检查签名:JNI类型和数据结构)

关于指针,如果是指向基本类型的指针,则通过在相应签名前面添加[来声明,这是:int*--

希望这有帮助。

万承志
2023-03-14

我自己解决了。Swig无法识别头文件中的所有typedef,因此它在包装器中生成了那种类型。我需要在接口文件中重新定义它们。

 类似资料:
  • 我有一些C语言的代码,其中一个方法有一个函数指针作为参数。我正在尝试在我的Android应用程序中使用C代码。 我决定使用SWIG来完成生成所需java文件的所有工作。常规函数(没有函数指针作为参数的函数)一切都很好。 但是我不确定如何将我的JAVA方法作为回调传递给C函数。 下面是一个例子: 这是我的密码。h文件 这是我的密码。c文件 这是我的接口文件multiply-swigi 然后我运行以下

  • 问题内容: 我试图弄清楚需要更改什么SWIG接口文件才能处理getFoo返回一个指向自定义结构数组(sender_id_t)的指针。没有任何特殊的SWIG接口代码,我只得到Java端的指针。如何将指针转换为可以循环或迭代的内容(在Java中),以便获取每个sender_id_t id值?感谢任何建议。 C结构: C函数: 例外: 问题答案: 最简单的解决方案不涉及编写任何JNI,实际上是方法2。因

  • 在下面的代码中,当函数print_uart传输字符串“hello world”时,*s中到底收到了什么?是字符H还是存储字符串“hello world”的内存地址?

  • 问题内容: 我有以下功能: 其中,的类型是具有以下定义的接口: 题: 这是真的,和是 通过按引用 ,并且有它的价值被复制? 我认为: 是通过引用的,因为它是一张地图 是一个结构。因此,我应该传递指针以避免复制数据 问题答案: 接口类型只是一组方法。请注意,接口定义的成员未指定接收方类型是否为指针。这是因为 值类型的方法集是其关联的指针类型的方法集的子集 。满嘴 我的意思是,如果您具有以下条件: 然

  • 我试图从lambda函数隐式构造一个对象。对象的构造函数将函数指针作为参数。但是代码[1]没有编译消息: 但是标准规定lambda函数可以隐式转换为具有相同参数和返回类型[2]的函数指针。这应该适用于这里,因此我希望构造函数是可调用的。 那么为什么代码不能编译呢?谢谢你的解释! [1]代码示例: https://godbolt.org/g/QE4v1Z [2]C 14标准在第5.1节中规定。2.建

  • 主要内容:用数组作函数参数在C语言中,函数的参数不仅可以是整数、小数、字符等具体的数据,还可以是指向它们的 指针。用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁。 像数组、字符串、动态分配的内存等都是一系列数据的集合,没有办法通过一个参数全部传入函数内部,只能传递它们的指针,在函数内部通过指针来影响这些数据集合。 有的时候,对于整数、小数