我已经创建了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 ++类,并且每个函数创建辅助函数都不能用于返回指针。
如果可能,请以任何其他方式提出建议。
答案 0 :(得分:1)
解决了自己。 Swig无法识别头文件中的所有typedef,因此它在包装器中生成了那种类型。我需要在Interface文件中重新定义它们。
答案 1 :(得分:0)
这是因为BOOL
类型的奇怪声明。
在这种特殊情况下,您可以从Java端传递int
。 0
或1
可以做正确的工作。
或者,您可以通过为此库创建一个小包装器,将原始代码中的BOOL
更改为bool
。
答案 2 :(得分:0)
关于布尔值,我建议使用bool
代替BOOL
,因为JNI直接为其提供了类型签名:Z
(您可以在JNI Types and Data Structures处查看签名)
关于指针,如果是指向基本类型的指针,则通过在相应签名前添加[
来声明,这是:int* --> [I
。如果它是指向自己类的指针,swig将创建一个完全限定的类。
希望这会有所帮助。
答案 3 :(得分:0)
SWIG不了解Windows类型。将%include <windows.i>
添加到接口定义。