- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我开始用JNA在电脑的RS485接口(interface)上和一个设备通讯。令我惊讶的是,我很快就取得了不错的成绩。但是现在我被一个简单的问题困住了。我使用的库接受一个指向结构指针的指针。实际签名是
func(Struct1 **, Struct2 **, Struct3 *, Struct4 *, long)
现在要指示第一个参数的大小,库希望最后一个指针为 NULL 指针。这就是失败的原因。以下代码是我到目前为止尝试过的:
Struct1.ByReference[] s = (Struct1.ByReference[]) new Struct1.ByReference().toArray(size);
int pos = 0;
// ...
// for loop to set the s[pos] struture values
for(pos = 0; pos < size - 1; pos++)
// ...
// Now set the last array element to a null pointer to indicate end-of-list
s[pos].getPointer().setPointer(0, null);// Following does not work: results in zero memoried structure
s[pos] = null; // Following does not work wither: NullPointerException at com.sun.jna.Structure.autoWrite
编辑 1
s[pos] = new Struct1.ByReference(Pointer.NULL); // results in zero memoried structure as well
编辑 2
根据technomage的问题。如果我要编写 C 代码,它可能看起来像这样:
Struct1 **s = malloc(n * sizeof(Struct1*));
for(int i=0; i<n; i++)
{
if(i == n -1)
{
s[i] = NULL;
}
else
{
s[i] = malloc(sizeof(Struct1));
s[i].bla = value;
....
}
}
但请注意:我对 C/C++ 不是很熟练。我认为 Java 是我的领域。
有人遇到过类似的问题吗?也许我只是只见树木不见森林......
提前致谢。
最佳答案
JNA 中的结构是指针,因此您在这里真正需要的是一个指向(指向一个)结构的指针,它是一个 PointerByReference
—— 在您的例子中,是一个结构的数组。
根据上面的代码示例,您将创建结构数组,比 n 少一个:
Struct1[] struct1Array = new Struct1[n-1];
这仅为数组分配 Java 内存。
接下来您将实例化并写入您对 native 内存所做的更改:
for (int i = 0; i < n-1; i++) {
struct1Array[i] = new Struct1();
struct1Array[i].bla = value;
struct1Array[i].write();
}
new Struct1()
为这些结构分配本地内存。也可以使用 Structure.toArray()
方法来做到这一点;我有意以更手动和更底层的方式执行此操作,以试图弄清楚发生了什么。
然后您将创建一个相应的PointerByReference
数组来保存指向这些结构的指针。您将为 null 添加一个额外的元素:
PointerByReference[] pbrArray = new PointerByReference[n];
同样,这只是java端的分配。然后用指向结构指针的指针填充它,从 Structure.getPointer()
方法获得:
for (int i = 0; i < n-1; i++) {
pbrArray[i] = new PointerByReference(struct1Array[i].getPointer());
}
pbrArray[n - 1] = new PointerByReference(Pointer.NULL);
这里的new PointerByReference()
为指针本身分配了本地内存,它指向你之前分配的本地结构。
根据我对您最初问题的理解,您会将此 PointerByReference
数组传递给您的函数,这可能会更新您的结构。
由于您以这种方式创建了两个数组,因此您可以通过数组索引跟踪它们的对应关系。您可能必须遍历结构数组并将 native 内存 read()
迭代到 Java 端结构中,以对其进行进一步处理。通常,当您直接使用传递给方法的结构时,它们会自动写入和自动读取,但是当使用 PointerByReference
间接引用结构时,JNA 就不那么友好了。
作为通过相应索引跟踪两个数组的替代方法,您可以“忘记”初始结构分配并稍后使用数组上的 PointerByReference.getValue()
方法恢复它以恢复指针到结构的内存中,然后在其构造函数中使用该指针实例化一个新结构(例如 new Struct1(pbr.getValue())
调用 super()
那个指针)。
关于java - JNA:将结构指针设置为 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36151245/
这个问题已经有答案了: Is there any way to accept only numeric values in a JTextField? (20 个回答) It's possible i
我使用戴尔 XPS M1710。笔记本电脑的盖子、侧面扬声器和前置扬声器都有灯(3 组灯可以单独调节)和鼠标垫下方的灯。在 BIOS 中,我可以更改这些灯的颜色,至少是每个组。另外,我可以在鼠标垫下打
我知道我可以使用 在 iOS 5 中打开设置应用 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"
我有一个 Django 应用程序,我正在尝试为其设置文档。目录结构如下: - doc - project | - manage.py 我已经设置了路径以便 Sphinx 可以看到东西,但是当我尝试使用
我正在使用 768mb ram 运行 centos 5.5。我一直在日志中获取 server reached MaxClients setting, consider raising the MaxC
我在具有以下配置的服务器内运行了 Drupal 安装: StartServers 5 MinSpareServers 5 MaxSpareServers 15 MaxClien
是否可以使用 Microsoft.Web.Administration 包为给定的 location 配置 asp 设置? 我想以编程方式将以下部分添加到本地 IIS applicationHost.
我一直在阅读为 kube-proxy 提供参数的文档,但没有解释应该如何使用这些参数。我使用 az aks create 创建我的集群使用 azure-cli 程序,然后我获得凭据并使用 kubect
我想知道与在 PHP 中使用 setcookie() 函数相比,在客户端通过 JavaScript 设置一些 cookie 是否有任何明显的优势?我能想到的唯一原因是减少一些网络流量(第一次)。但不是
我有一个按钮可以将 body class 设置为 .blackout 我正在使用 js-cookie设置cookie,下面的代码与我的按钮相关联。 $('#boToggle').on('click'
我有一堆自定义的 HTML div。我将其中的 3 存储在具有 slide 类的 div 中。然后,我使用该幻灯片类调用 slick 函数并应用如下设置: $('.slide').slick({
我正在创建一个应该在 Windows 8(桌面)上运行的应用 我需要: 允许用户使用我的应用启动“文件历史记录”。我需要找到打开“文件历史记录”的命令行。 我需要能够显示“文件历史记录”的当前设置。
我刚买了一台新的 MacBook Pro,并尝试在系统中设置 RVM。我安装了 RVM 并将默认设置为 ➜ rvm list default Default Ruby (for new shells)
由于有关 Firestore 中时间戳行为即将发生变化的警告,我正在尝试更改我的应用的初始化代码。 The behavior for Date objects stored in Firestore
在 ICS 中,网络 -> 数据使用设置屏幕中现在有“限制后台数据”设置。 有没有办法以编程方式为我的应用程序设置“限制后台数据”? 或 有没有办法为我的应用程序调出具有选项的“数据使用”设置? 最佳
我正在尝试使用 NextJS 应用程序设置 Jest,目前在 jest.config.js : module.exports = { testPathIgnorePatterns: ["/.n
我最近升级到 FlashDevelop 4,这当然已经将我之前的所有设置恢复到原来的状态。 我遇到的问题是我无法在新设置窗口的哪个位置找到关闭它在方括号、大括号等之前插入的自动空格的选项。 即它会自动
有没有办法以编程方式访问 iPhone/iPod touch 设置? 谢谢。比兰奇 最佳答案 大多数用户设置可以通过读取存储在 /User/Library/Preferences/ 中的属性列表来访问
删除某些值时,我需要选择哪些设置来维护有序队列。我创建了带有自动增量和主键的 id 的表。当我第一次插入值时,没问题。就像 1,2,3,4,5... 当删除某些值时,顺序会发生变化,例如 1,5,3.
我正在尝试设置示例 Symfony2 项目,如此处所示 http://symfony.com/doc/current/quick_tour/the_big_picture.html 在访问 confi
我是一名优秀的程序员,十分优秀!