
SWIG 默认不识别 C99 的 _Bool 类型,导致 bool 返回值被映射为 SWIGTYPE_p__Bool;可通过 %apply int { _Bool }、启用 C++ 模式或手动定义 Java typemap 三种方式正确映射为布尔逻辑。
swig 默认不识别 c99 的 `_bool` 类型,导致 `bool` 返回值被映射为 `swigtype_p__bool`;可通过 `%apply int { _bool }`、启用 c++ 模式或手动定义 java typemap 三种方式正确映射为布尔逻辑。
在使用 SWIG 封装 C99 代码时,bool 类型(定义于 <stdbool.h></stdbool.h>)常被错误地映射为 SWIGTYPE_p__Bool,而非预期的 Java boolean。这是因为 C99 中 bool 实质是宏定义:#define bool _Bool,而 _Bool 是一个独立的基础类型,SWIG(截至 4.1.x 版本)并未将其内置为原生支持的类型。即使显式 #include <stdbool.h></stdbool.h>,SWIG 仍无法自动将其关联到 Java 的 boolean 或 C 的整型语义。
✅ 推荐方案一:使用 %apply 简单映射(最实用)
在 .i 接口文件中,在 %include "bitwuzla.h" 之前添加以下行:
%apply int { _Bool };该指令告诉 SWIG:所有 _Bool 类型(包括由 bool 展开而来)均按 int 处理。生成的 Java 方法将返回 int,调用方需自行判断 0(false)或非零(true),或进一步封装为 boolean:
// 生成代码(简化)
public static int bitwuzla_sort_is_equal(SWIGTYPE_p_BitwuzlaSort sort0, SWIGTYPE_p_BitwuzlaSort sort1) {
return bitwuzlaJNI.bitwuzla_sort_is_equal(
SWIGTYPE_p_BitwuzlaSort.getCPtr(sort0),
SWIGTYPE_p_BitwuzlaSort.getCPtr(sort1)
);
}
// 安全调用示例
boolean equal = bitwuzla.bitwuzla_sort_is_equal(bvsort, varSort) != 0;
assert(equal);⚠️ 注意:此方案不改变底层 JNI 行为,仅统一类型映射;适用于绝大多数场景,且无需修改头文件或构建流程。
✅ 方案二:切换至 C++ 模式(语义更准确)
若项目允许,将 SWIG 调用改为 C++ 模式:
swig -c++ -DSWIGWORDSIZE64 -includeall \
-I/usr/lib/gcc/x86_64-linux-gnu/11/include \
-I/usr/include -java bitwuzla.i并在接口文件中确保 C++ 兼容性:
%module bitwuzla
%{
#include "bitwuzla.h"
%}
%include "std_string.i" // 可选,增强 C++ 支持
%include <stdbool.h>
// ... 其余内容不变此时 bool 被解析为 C++ bool,SWIG 原生支持其映射为 Java boolean,生成方法签名即为:
public static boolean bitwuzla_sort_is_equal(SWIGTYPE_p_BitwuzlaSort sort0, SWIGTYPE_p_BitwuzlaSort sort1)
✅ 方案三:手动定义完整 typemap(高级定制)
如需完全控制(例如映射为 java.lang.Boolean 或添加空值处理),可参考 java.swg 手动声明 typemap:
%typemap(jni) _Bool "jboolean"
%typemap(jtype) _Bool "boolean"
%typemap(javain) _Bool "$javainput"
%typemap(in, numinputs=0) _Bool "jboolean jarg$argnum = ($javainput) ? JNI_TRUE : JNI_FALSE;"
%typemap(argout) _Bool ""
%typemap(out) _Bool {
$result = ($jnicall == JNI_TRUE) ? JNI_TRUE : JNI_FALSE;
}
%typemap(javaout) _Bool {
return $jnicall != 0;
}该方案灵活性最高,但维护成本增加,建议仅在有特殊需求(如与 Optional<boolean></boolean> 集成)时采用。
总结
-
首选
%apply int { _Bool }:简洁、稳定、兼容性强,适合快速修复; - C++ 模式:语义最严谨,适合新项目或已支持 C++ 构建链的工程;
- 自定义 typemap:面向复杂交互场景,需充分测试 JNI 边界行为。
无论选择哪种方式,请确保 #include <stdbool.h></stdbool.h> 出现在 %{ %} 区块之外(即被 SWIG 解析),且避免重复包含或条件编译干扰 _Bool 的可见性。完成修改后,重新运行 SWIG 并重建 Java 绑定即可获得符合直觉的布尔接口。

















