JNA 通过以下方式映射到本机库libffi
。没有bool
输入libffi
所以必须使用其他映射——JNA默认类型映射 https://github.com/java-native-access/jna/blob/master/src/com/sun/jna/Structure.java#L1978选择映射boolean
to ffi_type_uint32
。这在结构中有效,因为它恰好与 32 位映射大小匹配,但与定义不匹配:在 C 中,0 为 false,任何非零值均为 true。仅当本机类型也是boolean
这个 0/非零解释是否重新恢复为 false/true 的含义。
使用网络搜索FFI
or JNI
and boolean
关键字可以揭示多个示例,例如this one https://www.reddit.com/r/rust/comments/3t6mbg/ffi_mystery/ and this one https://github.com/eclipse/openj9/issues/4193当通过 FFI 或 JNI 访问库并且不符合布尔值的 0 / 1 要求时,会出现不可预测的结果。后一个示例看起来与真正的 Java 的情况非常相似boolean
被解释为 Cint
具有 1 以外的值。
在 FFI 和您的库之间的某个地方,并且可能在编译的字节代码和/或平台/编译器相关的类型转换中,很可能会应用按位“not”0x00000000
,把它变成0xffffffff
这在 C 中仍然是“true”。
最重要的是,JNA 默认情况下会映射 Java 布尔值false
转换为 32 位本机值 0 和 Java 布尔值true
为非 0 的 32 位本机值,这就是可以假设的全部内容。如果您的图书馆需要true
要使整数值为 1,请使用可以专门设置的整数类型,或者使用自定义类型映射boolean
这设置了一个int
为您设置为 0 或 1。 JNA的W32API类型映射器 https://github.com/java-native-access/jna/blob/master/src/com/sun/jna/win32/W32APITypeMapper.java有一个在 Windows 上转换为 1 或 0 的示例BOOL
type.
在您的情况下,假设您正在映射 VkSwapchainCreateInfoKHR 结构此处定义 http://%20%20%5B1%5D:%20http://vulkan-spec-chunked.ahcox.com/ch29s06.html,类型clipped
是 VkBool32:
typedef struct VkSwapchainCreateInfoKHR {
VkStructureType sType;
const void* pNext;
VkSwapchainCreateFlagsKHR flags;
VkSurfaceKHR surface;
uint32_t minImageCount;
VkFormat imageFormat;
VkColorSpaceKHR imageColorSpace;
VkExtent2D imageExtent;
uint32_t imageArrayLayers;
VkImageUsageFlags imageUsage;
VkSharingMode imageSharingMode;
uint32_t queueFamilyIndexCount;
const uint32_t* pQueueFamilyIndices;
VkSurfaceTransformFlagBitsKHR preTransform;
VkCompositeAlphaFlagBitsKHR compositeAlpha;
VkPresentModeKHR presentMode;
VkBool32 clipped;
VkSwapchainKHR oldSwapchain;
} VkSwapchainCreateInfoKHR;
Where...
typedef uint32_t VkBool32;
So int
这里的映射是正确的——你需要映射clipped
为 32 位整数Edit:正如您在答案中指出的那样,添加您自己的类型映射器来更好地处理这些问题很简单int
价值观!
(While I'm reviewing the type mappings, you might find IntByReference
a better mapping than Pointer
for the pQueueFamilyIndices
field.) (Your mapping is correct for a variable length int
array.)