java - JNA - 如何将 `char ***devices` PointerByReferences 转换为 `char **devices` PointerByReference
问题描述
这是c头文件:
idevice_error_t idevice_get_device_list(char ***devices, int *count);
idevice_error_t idevice_device_list_free(char **devices);
这是 JNAerator 为我生成的 JNA:
int idevice_get_device_list(PointerByReference devices, IntBuffer count);
int idevice_device_list_free(PointerByReference devices);
这是我使用它的方式。它在 Kotlin 中,但它也等同于您在 Java 中所做的:
fun getDeviceList(): List<String> {
val deviceUuidsPbr = PointerByReference()
val deviceSizeBuffer = IntBuffer.wrap(IntArray(1))
val resultInt = LibIMobileDeviceLibrary.INSTANCE.idevice_get_device_list(deviceUuidsPbr, deviceSizeBuffer)
val size = deviceSizeBuffer.get()
logger.v {"getDeviceList $resultInt, Size: $size" }
val stringArrayP = deviceUuidsPbr.value
val devices = stringArrayP
.getStringArray(0, size)
.toList()
logger.v { "Devices: $devices" }
LibIMobileDeviceLibrary.INSTANCE.idevice_device_list_free(deviceUuidsPbr)
return devices
}
当我释放内存时,一切都会爆炸:
LibIMobileDeviceLibrary.INSTANCE.idevice_device_list_free(deviceUuidsPbr)
免费的想要一个char **devices
,但我正在提交一个char ***devices
。我应该如何PointerByReference
进入正确的格式?
解决方案
APointerByReference
只是一个指针(指向指针)。并且被映射的两个 C 函数只是具有额外的间接级别。
考虑这个函数定义:
device_get_device_list(char ***devices, int *count);
idevice_device_list_free(char **devices);
现在考虑foo
定义为*devices
,原始函数简化为:
device_get_device_list(char **foo, int *count);
idevice_device_list_free(char *foo);
如果你定义bar
你*foo
得到:
device_get_device_list(char *bar, int *count);
idevice_device_list_free(char bar);
所以你不能将PointerByReference
你从device_get_device_list
( *bar
) 收到的直接传递给idevice_device_list_free
(which needs bar
); 您传递其指向的值(恰好是指向另一个指针的指针,但这没关系。)
在 Java 中,您只需将idevice_device_list_free()
调用中的参数从更改deviceUuidsPbr
为deviceUuidsPbr.getValue()
。
我不是 Kotlin 用户,但它似乎基于您在deviceUuidsPbr.value
那里需要的其他代码。
推荐阅读
- cassandra - 当您不能依赖主键或 uuid 时,Cassandra 插入/更新不重复
- python - 删除管道之前的所有字符,并在 python 中使用正则表达式删除管道
- java - AWS S3 - Java SDK - 检索一批密钥的标签
- python - 如何使用 Python 从产品目录页面中抓取产品?
- c++ - 作为类成员的灵活数组
- apache - LetsEncrypt 与 Apache2 重定向
- python-3.x - Tkinter 刷新/更新我的框架功能?
- typescript - 如何从定义为第一类属性的类中访问类的属性?
- r - Shiny:自定义 NearPoints 的输出
- c++ - 将 20 个字节偏移量添加到指针地址