JNA 将 Java 布尔值映射到 -1 整数?

2023-12-26

我在传递时使用的本机库收到了令人惊讶的警告booleanJNA 结构中的值:

value of pCreateInfo->clipped (-1) is neither VK_TRUE nor VK_FALSE

在这个图书馆里VK_TRUE and VK_FALSE分别#define为1和0。

结构本身并不是特别复杂,其他一切appears工作(本机库似乎将“未定义”布尔值视为 false),但无论如何:

public class VkSwapchainCreateInfoKHR extends Structure {
    public int sType;
    public Pointer pNext;
    public int flags;
    public Pointer surface;
    public int minImageCount;
    public int imageFormat;
    public int imageColorSpace;
    public VkExtent2D imageExtent;
    public int imageArrayLayers;
    public int imageUsage;
    public int imageSharingMode;
    public int queueFamilyIndexCount;
    public Pointer pQueueFamilyIndices;
    public int preTransform;
    public int compositeAlpha;
    public int presentMode;
    public boolean clipped;       // <--------- this is the field in question
    public Pointer oldSwapchain;
}

If the clipped字段为 false 则没有警告,如果为 true,则我收到警告 - 看来 JNA 正在映射true到整数-1?

该库使用的本机布尔值并不多,但每当一个设置为 true 时,我都会得到相同的行为(并且其他一切都工作正常)。

特别是,如果我改变clipped成为一个int并将值显式设置为 1 或 0 一切正常!

-1 是 JNA 布尔值的默认值吗true?

如果是这样,我将如何覆盖类型映射?

或者我应该使用int“手动”?


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.)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JNA 将 Java 布尔值映射到 -1 整数? 的相关文章

  • Java 使用服务器证书对 jar 进行签名

    是否可以使用服务器证书来签署 java web start 应用程序 我想知道的是它是否有效 我的服务器有一个受信任的证书 并且我想重复使用同一证书来签署应用程序 现在 我有这样的警告 此 jar 包含其签名者证书的 ExtendedKey
  • Java中如何动态添加charsequence[]中的数据?

    初始化的一种方法charsequence is charsequence item abc def 但我不想以这种方式初始化它 有人可以建议其他方式吗 比如我们初始化的方式string arrays 首先 修复变量声明 charsequen
  • 术语“引用”的起源,如“通过引用传递”

    Java C 语言律师喜欢说他们的语言按值传递引用 这意味着 引用 是调用函数时复制的对象指针 同时 在 C 中 以及 Perl 和 PHP 中更动态的形式 引用是其他名称 或动态情况下的运行时值 的别名 我对这里的词源感兴趣 参考 一词的
  • 如何让 HttpClient 返回状态码和响应正文?

    我试图让 Apache HttpClient 触发 HTTP 请求 然后显示 HTTP 响应代码 200 404 500 等 以及 HTTP 响应正文 文本字符串 重要的是要注意我正在使用v4 2 2因为大多数 HttpClient 示例都
  • IntSummaryStatistics的summaryStatistics方法

    为什么空 IntStream 上的 summaryStatistics 方法返回整数的最大和最小值作为流中存在的最大和最小 int 值 IntStream intStream IntStream of IntSummaryStatistic
  • 将 RequestBody json 转换为对象 - Spring Boot

    我是 java 开发的初学者 但之前有 PHP 和 Python 等编程语言的经验 对于如何进行 Spring Boot 的开发几乎没有什么困惑 我正在开发一个rest API 它有以下请求 key value key1 value1 pl
  • 处理 ANTLR 4 中的错误

    遵循后接受的答案 https stackoverflow com a 18137301 2279200的指示处理 ANTLR4 中的错误 https stackoverflow com q 18132078 2279200问题 我遇到了以下
  • a4j:commandLink 重新渲染后停止工作

    我创建了这个测试用例来隔离我的问题 一旦轮询执行 ajax 更新 a4j commandLink 操作就不会执行 如果我们在轮询重新渲染之前关闭 modalPanel 则会执行它 有什么建议吗 提前致谢 测试 xhtml
  • 维护插入顺序的并发集合[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以维护插入顺序的并发列表 有人有什么好的推荐吗 我看一些番石榴 例如SetFromMa
  • Android 反向地理编码不适用于华为设备

    我正在尝试通过这段代码反转地理编码纬度 经度 Geocoder geocoder new Geocoder context Locale ENGLISH try List
  • Spring Boot 多部分文件始终为 null

    我正在使用 Spring Boot version 1 4 0 RC1 和 Spring Boot Stormpath 1 0 2 我正在尝试使用分段文件上传 但控制器中的 MultipartFile 始终为空 当我使用 RequestPa
  • 有界通配符相关的编译器错误

    我想知道这段代码有什么问题 Map 但我试图说得更具体 这个问题在这个旧的 Apache 线程 ht
  • 将字符串转换为字符并按降序排序(ascii)

    我正在创建一个程序 该程序将使用户输入整数 一个接一个 存储在数组中并按降序显示整数 该程序还要求用户输入一个字符串 使用以下命令将其转换为字符string toCharArray 我已经正确地按降序显示整数 问题是我不知道如何按降序显示字
  • logcat 信息出现在 Android Studio 的“运行”选项卡中

    我的 android studio 运行选项卡很简单 然后它变得更难并给我更多信息 例如 logcat 中的信息 如何禁用或删除第二张图片中出现的更多信息并返回到第一张图片中的第一个外观 我只需要正在运行的 flutter 应用程序的日志输
  • 如何从 java.sql.Blob 类型的 zip 文件中读取和提取 zip 条目,而无需将 FileInputStream 或文件路径作为字符串 java

    public static void unzipFiles java sql Blob zip throws Exception String paths byte blobAsBytes zip getBytes 1 int zip le
  • 如何从Java中的连接获取查询字符串?

    我正在编写一个方法 尝试记录数据库调用 形成连接到它的连接 在查询之后 有很多地方调用方法 connect 来启动并调用 cleanUp 方法来结束 我不能并且不想修改每个地方 所以顺序是这样的 Connection con connect
  • 找出该月第一个星期日/星期一等的日期

    我想在java中检测每个月第一周 第二周的第一个星期日 星期一的日期 我怎样才能实现它 我已经检查了 java 中的 Calendar 类和 Date 类 但无法找到解决方案 所以请帮助我解决这个问题 Calendar calendar C
  • 有没有办法处理Java堆空间异常[重复]

    这个问题在这里已经有答案了 我正在寻找将文件输入流转换为大文件 文件大小为 100MB 并且抛出 java lang OutOfMemoryError Java Heap space import java io FileInputStre
  • Jackson 的 ObjectMapper 和 SQL 中的 RowMapper

    我们正在使用对象映射器 当将 ObjectMapper 与 RowMapper 一起使用时 是否应该在每个 mapRow 内部 如下所示 声明它 还是在 mapRow 外部声明为类公共成员 我认为根据本文 它应该作为公共类成员在外部 我应该
  • 将 JSON 发送到 Spring MVC 控制器

    我正在尝试将 JSON 发送到 Spring MVC 控制器 在 Spring MVC 方面 一切都配置正确 下面是代码 但似乎没有运行

随机推荐

  • @RequestParam 和 @RequestMapping 之间的区别

    Line1 public ModelAndView viewCustomerDetails RequestParam custId Integer customerId RequestParam categoryName String ca
  • 启用 VCL 样式的应用程序和显示缩放时 Windows 标题栏中的视觉错误

    目前我正在测试启用 VCL 样式的应用程序的各个方面 我注意到 Windows 缩放比例高于默认的 96 dpi 100 VCL 表单的图标和标题栏文本太大 并且两者都靠得很近 请参阅随附的屏幕截图 对于 200 或 250 等更高的缩放
  • 如何用 Java 发送电子邮件?

    我需要从 Tomcat 中运行的 servlet 发送电子邮件 我总是会向同一收件人发送相同主题但内容不同的邮件 用 Java 发送电子邮件的简单方法是什么 Related 如何使用 GMail 从 Java 应用程序发送电子邮件 http
  • List.of 和 A​​rrays.asList 有什么区别?

    Java 9 引入了新的列表工厂方法 List of https docs oracle com javase 9 docs api java util List html of E List
  • 如何按颜色划分二分图?

    例如 假设我有一个图 G V E 其中 V A B C D E A B A D C D 该图是二分图 因此可以分为两个不相交的集合 A C 和 B D 我的第一个猜测是 我可以简单地遍历图形并为每个顶点指定交替的颜色 是这样吗 还是比这更复
  • Doctype 元和怪异模式

    请我在这里澄清一些想法 如果未指定文档类型 则调用 Quirksmode but 当从本地主机提供服务时 无论文档类型如何 IE 似乎都会进入怪异模式 请确认这一点 有人可以解释为什么会出现这种情况吗 however 当从本地主机提供服务并
  • 如何有条件地将一行 Excel 数据从一张工作表附加到另一张工作表?

    我不经常使用 Excel 但我希望有一种相当简单的方法来解决这个问题 我查看了许多其他解决方案 涉及将数据从一张纸粘贴到另一张纸 但我找不到任何可以让我 1 将单元格从一张纸匹配到另一张纸 然后 2 有条件附加或连接数据的东西而不是简单地粘
  • 如何在不安装Oracle客户端和cx_Oracle的情况下访问Oracle数据库?

    我有两台分别运行 Python 2 4 和 2 6 的 RHEL 服务器 我需要访问另一台服务器上的 Oracle 数据库 我尝试在 RHEL 服务器上安装 cx oracle 但发现必须先安装 Oracle 客户端 问题是 我没有权限在两
  • 使用该列的最大值标准化列数据

    我有一个包含两列的数据文件 我想找出第二列中的最大数据值 并将第二列的每个条目除以最大值 所以我将获得第二列 我尝试使用下面的命令 awk BEGIN max 0 if 2 gt max max 2 print 2 max angleOut
  • 如何从 QProcess 获取 STDOUT?

    我想我将使用以下代码从 QProcess 获取输出 Start the process process start tr php cgi www test php QIODevice ReadWrite Wait for it to sta
  • 如何使用 Rails 3 和 Ruby 1.9.2 创建 Windows 服务?

    如何使用 Mongrel 创建带有 Rails 3 和 Ruby 1 9 2 的 Windows 服务 几年前mongrel serviceMongrel 的扩展用于提供将 Rails 应用程序 使用 mongrel service 作为服
  • 溢出换行:断字与断字:断字

    有什么区别overflow wrap break word and word break break word 正如您从以下示例中看到的 选项 1 和选项 2 之间没有视觉差异 您需要取消注释其中之一 body width 300px do
  • 减少 MVVM WPF 应用程序中附加属性、命令等的样板代码?

    我正在开发 WPF MVVM 应用程序 我注意到 我必须编写大量样板代码来声明命令 通过 WPF 团队的 MVVM 工具包中的 DelegateCommands 附加属性和附加行为 是否有任何策略可以减少我必须编写的样板代码量 Thanks
  • 找到右键单击的选项 c# White/TestStack UI Automation

    我正在使用 White TestStack 的 C 语言框架创建软件流程自动化 我遇到问题 因为当我单击鼠标右键时无法捕获选项 图像预览 我用来尝试这个的代码 panel RightClick var propClick mainWindo
  • Matlab:获取图像的子集

    我正在尝试从 4 个点获取图像的子集 按照中给出的解决方案here https stackoverflow com questions 4564530 how do i create a subimage from an image in
  • 命令行包 Service Fabric 应用程序

    直到最近 我们的持续交付设置都是使用以下命令交付 Service Fabric 包 msbuild SFApp sfproj t Package 这是必要的 因为目标Package在解决方案级别不可用 IE 命令 msbuild SFSol
  • 寻找集体智慧.Net / C# 资源 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 首先 我意识到这是一个与此非常相似的问题 net java 中有哪些优秀的集体智能开源库 https
  • 检查fragment是否在framelayout中出现在android中?

    嗨 朋友们 我在 movie xml 中有两个框架布局容器 详细信息屏幕 在容器中会添加电影 xml其中包含listview 并且在detail screen中将有可扩展的listview 称为movie details xml 现在想以编
  • 如何根据另一个字段中的查找值返回一个字段中的值

    这是基本内容 但我对 VBA 和 Word Access 对象模型有些不熟悉 我有一个包含大约 117000 条记录的两列数据库 列是 姓氏 和 计数 我希望用户能够在文本框中输入 SMITH 并点击提交 然后我想运行类似的东西 SELEC
  • JNA 将 Java 布尔值映射到 -1 整数?

    我在传递时使用的本机库收到了令人惊讶的警告booleanJNA 结构中的值 value of pCreateInfo gt clipped 1 is neither VK TRUE nor VK FALSE 在这个图书馆里VK TRUE a