【问题标题】:C++ Function with pointer as parameter and Handle it with swig interface以指针为参数的 C++ 函数并使用 swig 接口处理它
【发布时间】:2025-11-27 23:55:02
【问题描述】:

我已经创建了 swig 接口文件来为我的 C++ 文件创建 JNI。但是我的一些 C++ 文件包含接受指针作为参数的函数,例如 (void*) ,C++ BOOL 和 Swig 将其转换为 type like 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++ 类,并且为每个函数创建返回指针的辅助函数是不可行的。

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

【问题讨论】:

    标签: java c++ java-native-interface swig freeimage


    【解决方案1】:

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

    【讨论】:

    • SWIG 默认情况下不会递归到 #include 定义中,而且您通常不希望它这样做。请参阅我的回答,让 SWIG 了解 BOOL 等 Windows 类型。
    【解决方案2】:

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

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

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

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

      在这种特殊情况下,您可以从 Java 端传递一个int01 都能胜任。

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

      【讨论】:

      • 我无法使用 java 端的 0,1 代替 SWIGTYPE_p_int32_t。以及函数返回 SWIGTYPE_p_int32_t 和 void* 类型的指针的情况呢?
      • 但是您可以将此类型修补为简单的int。如果您的函数返回 void*,那么您在 Java 中就无法使用它。但是,您可以将其存储在 int 中并将其传递回接受 void* 的本机代码。
      • 先生,我可以为一个函数修补它,但我正在尝试创建第三方库的包装器,其中包括这些类型在代码中的许多地方,而不仅仅是单个函数。
      • 你可以#define SWIGTYPE_p_int32_t int
      【解决方案4】:

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

      【讨论】: