首页 > 解决方案 > 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进入正确的格式?

标签: javakotlinpointersjna

解决方案


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()调用中的参数从更改deviceUuidsPbrdeviceUuidsPbr.getValue()

我不是 Kotlin 用户,但它似乎基于您在deviceUuidsPbr.value那里需要的其他代码。


推荐阅读