0

我创建了 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++ 类,并且为每个函数创建用于返回指针的辅助函数不是可行的方法。

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

4

4 回答 4

1

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

于 2013-11-14T13:00:29.070 回答
0

这是因为BOOL类型的奇怪声明。

在这种特殊情况下,您可以int从 Java 端传递一个。要么01将做正确的工作。

或者您可以通过为此库创建一个小型包装器来更改您的本机代码BOOLbool

于 2013-11-14T10:50:47.487 回答
0

关于布尔值,我建议使用bool而不是BOOL因为 JNI 直接为其提供了类型签名:(Z您可以在:JNI Types and Data Structures中检查签名)

关于指针,如果是指向基本类型的指针,则[在相应的签名前加上声明,即:int* --> [I. 如果它是指向自己的类的指针,swig 将创建一个完全限定的类。

希望这可以帮助。

于 2013-11-14T11:10:51.103 回答
0

SWIG 不知道 Windows 类型。添加%include <windows.i>到接口定义。

于 2013-11-15T21:09:32.990 回答