C++;以指针为参数的函数,通过swig接口进行处理 我创建了Sigg接口文件,为我的C++文件创建JNI。但是我的一些C++文件中包含了函数,这些函数接受指针作为参数(空虚*),C++布尔和SWIG将其转换为 像SWIGTYPE\u p\u int32\u t这样的类型如何从java传递此类数据类型
例如,函数的一个实际原型如下所示++C++;以指针为参数的函数,通过swig接口进行处理 我创建了Sigg接口文件,为我的C++文件创建JNI。但是我的一些C++文件中包含了函数,这些函数接受指针作为参数(空虚*),C++布尔和SWIG将其转换为 像SWIGTYPE\u p\u int32\u t这样的类型如何从java传递此类数据类型,java,c++,java-native-interface,swig,freeimage,Java,C++,Java Native Interface,Swig,Freeimage,例如,函数的一个实际原型如下所示++ DLL_API void DLL_CALLCONV FreeImage_Initialise(BOOL load_local_plugins_only FI_DEFAULT(FALSE)); 在Java文件中使用swig进行转换 public static void FreeImage_Initialise(SWIGTYPE_p_int32_t load_local_plugins_only) 如何从java传递这样的值 我有很多类在函数中包含这样的参数
DLL_API void DLL_CALLCONV FreeImage_Initialise(BOOL load_local_plugins_only FI_DEFAULT(FALSE));
在Java文件中使用swig进行转换
public static void FreeImage_Initialise(SWIGTYPE_p_int32_t load_local_plugins_only)
如何从java传递这样的值
我有很多类在函数中包含这样的参数。
是否有任何方法可以将解决方案应用于批量文件,以尽可能简单地处理数据类型
我读过一个方法是创建帮助函数,但我不能去,因为我有很多C++类,并且对于每个函数,创建返回指针的帮助函数是不可行的。
如果可能,请建议任何其他方式。这是因为
BOOL
类型的声明很奇怪
在这种特殊情况下,您可以从Java端传递一个int
。无论是0
还是1
都将完成正确的工作
或者,通过为此库创建一个小包装器,您可以将本机代码中的
BOOL
更改为BOOL
。关于booleans,我建议使用BOOL
而不是BOOL
,因为JNI直接为其提供类型签名:Z
(您可以在以下位置检查签名:)
关于指针,如果是指向基本类型的指针,则通过在相应签名前面添加[
来声明,这是:int*-->[I
。如果是指向自己类的指针,swig将创建完全限定类
希望这有帮助。我自己解决了。Swig无法识别头文件中的所有typedef,因此它在包装器中生成了这种类型。我需要在接口文件中重新定义它们。Swig不知道windows类型。将
%include
添加到接口定义中。我无法使用java si中的0,1de代替SWIGTYPE_p_int32_t。函数返回SWIGTYPE_p_int32_t和void*类指针的情况如何?但您可以将此类型修补为一个简单的int
。如果您的函数返回void*
,则在Java中无法对其进行太多处理。但是,您可以将其存储在int
中,并将其传递回本机代码re它接受void*
。我可以为一个函数修补它,先生,但我正在尝试创建第三方库的包装器,它在代码中的多个位置包含这些类型,而不仅仅是单个函数。你可以#定义SWIGTYPE_p#u int32_t int
SWIG默认情况下不会递归到#include definitions,你通常不希望它这样做。请参阅我的答案,让SWIG了解BOOL等Windows类型。