问题标签 [jnaerator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3811 浏览

jna - 如何使用 JNAerator?

我想使用 JNAerator 为 JNA 生成一些 C++ API 函数的 Java 包装器。问题是我无法在工作时使用 JNAerator Studio 或从我的 PC 访问 Github。我只有来自 Github 存储库的 .zip 文件。我找不到任何关于如何从命令行使用它的文档或教程。谁能帮我吗?

编辑:我试图用 maven 编译存储库,但我收到一个错误,上面写着“不可解析的父 POM”。但无论如何,我不知道编译后如何处理存储库。我需要采取哪些步骤才能使用 JNAerator/如何设置它?

0 投票
0 回答
158 浏览

java - 用 JNAerator 包装 C 类头

我有以下代码:

人.h:

个人.cpp:

我运行以下命令:


从 jnaerator 文件夹中,我给出了 Person.h 的绝对路径,但它不起作用,有没有办法通过 jnaerator 生成 JNA 代码到 C 类头?

0 投票
1 回答
91 浏览

jvm - 使用 JNA 读取字节值的平台差异

我创建了一个 JavaFX 应用程序来从 FTDI 外围设备检索数据。我使用 JNAerator 生成 API,一切都在我的开发机器 (OS X) 上运行良好。但是,当在同事的盒子 (Windows) 上进行测试时,BirdJ Pointer.getBytes() 方法返回字节数组,其中每个值正好相差 128。

Java 中是否存在已知的平台差异或其他东西可以解释这种不一致的行为,或者这更可能是本机 FTDI 驱动程序中的问题?

有没有比引入丑陋的平台特定逻辑来修改读取或写入的每个字节更简洁的方法来解决它?

编辑

我不确定我的问题描述是否清楚。这是一个具体的例子。

我从 FTDI 设备请求 3 个字节以确认它已准备好发送数据。我得到 [-91, -1, -1] 与文档中说期望“A5 FF FF”相匹配。我的代码是为了接受这个答案而编写的,一切都进行得很好。

我的同事得到 [37, 127, 127] ,即“25 7F 7F”。由于这不是预期值,因此我的代码会报告错误并退出。

0 投票
1 回答
147 浏览

java - 如何在 64 位应用程序中以 32 位模式使用 BridJ?

我正在尝试以不确定是否受支持的方式使用 BridJ:

我有一个 64 位应用程序。我通过调试器接口获得了一个包含 32 位应用程序内存的字节数组。

我想使用 BridJ 将此字节数组的内容解析为 C 数据类型。我通过使用Pointer.pointerToBytes().as(my_struct.class).get(). 此技术适用于 32 位应用程序。但在 64 位应用程序中它不会,因为 BridJ 使用主机应用程序的字长(64 位),而我想使用字节数组的字长(32 位)。

可以这样做吗?是否可以手动切换 BridJ 的字长,以便 BridJ 使用 32 位字,即使它在 64 位应用程序中运行?

我正在尝试做的更长的例子

更多细节

  • 我使用JNAerator生成 BridJ 类
  • 我尝试使用 JNAerator-arch标志,但它似乎并没有达到我想要的效果。
  • 我没有将本机库与 BridJ 一起使用,我只是使用 BridJ 来读取通过调试器 API 获得的字节数组。
0 投票
1 回答
554 浏览

java - 如何将 GetProcAddress 与 JNA 一起使用?

首先,我是JNA新手。我想通过 Java 代码控制主板的 LED 灯。华硕为此提供了一个用 C(C++?)编写的 SDK。

他们的头文件看起来很简单:

我使用 JNAerator 来获取 JNA 映射,这是我得到的结果:

在示例 C++ 代码中,他们使用 GetProcAddress 来获取上述方法的地址,这样他们就可以调用它们:

我如何对 JNA 做同样的事情?

提前致谢。

0 投票
0 回答
239 浏览

java - 如何使用 Java (JNA) 访问 dll 中的类的函数

我正在尝试使用名为Windows.Devices.PointOfService的 Windows dll 中的 CashDrawer 类( https://docs.microsoft.com/en-us/uwp/api/Windows.Devices.PointOfService.CashDrawer )的几个函数。使用 JNA 通过 Java 获取dll,此处提供了示例:https ://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CashDrawer

我使用 JNA 调用msvcrt.dll尝试了一个简单的 helloworld,但在这里和所有示例中,我发现使用的函数直接在 dll 中。我的问题是我不知道如何在 Windows.Devices.PointOfService 中访问 CashDrawer 的功能。

简单的例子:

我想打开一个 CashDrawer,目前我只能这样做:

我没有成功的其他选择是使用 JNAerator 为Windows.Devices.PointOfService.dll生成 Java 接口,但我不知道该怎么做。

0 投票
1 回答
190 浏览

java - 使用 JNA 时 Mac 和 Windows 之间的 FTDI 库平台差异

我目前正在开发一个 Java 应用程序,它使用 JNA 访问一些 FTDI 库,包括 D2XX 和 LibFT4222。我已经使用 JNAerator 创建了使用的 JNA。这一切都在 Windows 平台上正常工作。但是,当尝试在 Mac 上运行该软件时,我遇到了 LibFT4222 的问题。

FT_OpenEx 在 D2XX 中似乎可以正常工作,导致没有错误代码,我还可以查看其返回的描述,看到它列为“FT4222 A”。我还能够执行其他功能而不会返回意外的错误代码(例如关闭它两次,第一次导致没有错误代码,第二次导致预期的错误代码)。但是,当尝试在 D2XX 创建的句柄上使用 LibFT4222 进行任何操作时,例如 FT4222_I2CMaster_Init、FT4222_GetVersion 或 FT4222_GetClock,它会产生错误代码 1000 FT4222_DEVICE_NOT_SUPPORTED。

我尝试过使用生成的 JNA 代码,例如将 FT HANDLE 类型从 PointerByReference 更改为 IntByReference,并且可以让它像以前一样在 Windows 上正常工作,但似乎仍然没有让它在 Mac 上工作。

使用 FTDI 提供的示例 C 文件的修改版本(使用相同的 LibFT4222.dylib),相同的逻辑可以正常工作,所以我知道它可以在 Mac 上正常工作。如前所述,以上所有方法在 Windows 上都没有问题。

任何人都可以就可能导致这种行为的 Mac OSX 和 Windows 之间的差异提供任何见解吗?

编辑以包含代码,示例 Java 代码(在这种情况下,描述将是“FT4222 A”,并且 OpenEx 似乎可以正常工作)这适用于 Windows,但在 Mac 上 FT4222_I2CMaster_Init 返回 1000:

FT_OpenEx 在哪里(由 JNAerator 自动生成):/**

其中 FT4222_I2CMaster_Initis(由 JNAerator 自动生成):

FT_HANDLE 在哪里(由 JNAerator 自动生成):

C 代码在 Mac 上正常工作(返回 0):

0 投票
0 回答
49 浏览

java - JNAerator 使用 __stdcall 返回值生成方法

我目前正在努力为我必须使用的 DLL 生成 JNA 包装器。DLL 和相应的 .h 文件由 IBM(Spectrum Protect aka Tivoli Storage Manager 或 ADSTAR)提供,而且在我看来,我无法正确使用 JNAerator。

例子:

这是其中一个头文件的摘录:

这个 dsInt16_t 原来是在一个单独的 .h 文件中定义的:

运行 JNAerator 后的结果不是我所期望的:

返回类型定义如下:

请注意,我上次和 C 一起工作是在学校,那是 20 多年前,所以我肯定有点生疏了。

我在这里想念什么?例如,我希望返回值是 dsInt16_t 或短。

追问:DLL提供了解释返回码的方法(前面提到的dsInt16_t返回值)。

同样,这是 .h 文件中的定义:

...这是生成的 Java 代码:

因此,它将 C 参数类型 dsInt16_t “翻译”为 Java 类型 dsInt16_t,这很好。由于这个 Java 类型 dsInt16_t 是一个接口,我将如何创建这种类型的实例以便我可以实际调用该方法?(我想一旦第一个问题得到解决,这个问题就已经过时了。)