libimobiledevice返回奇怪的字符

时间:2019-02-12 06:03:47

标签: java c jna libimobiledevice

我正在尝试与连接的iOS设备配对,并使用libimobiledevice和JNA获取UDID。这就是我声明本机函数的方式:

static native int idevice_new(PointerByReference device, Pointer udid);
static native int lockdownd_client_new(Pointer device, PointerByReference client, String label);
static native int idevice_get_udid(Pointer idevice, StringByReference udid);
static native int lockdownd_query_type(Pointer lockdownd_client, StringByReference type);

为了进行测试,我正在尝试完全执行命令idevicepair pair所做的事情。

这是我的主要方法:

PointerByReference device = new PointerByReference();
System.out.println("idevice_new error code: " + idevice_new(device, Pointer.NULL));
PointerByReference client = new PointerByReference();
System.out.println("lockdownd_client_new error code: " + lockdownd_client_new(device.getValue(), client, "java"));
StringByReference udid = new StringByReference();
System.out.println("idevice_get_udid error code: " + idevice_get_udid(device.getValue(), udid));
System.out.println("udid: " + udid.getValue());
StringByReference type = new StringByReference();
System.out.println("lockdownd_query_type error code: " + lockdownd_query_type(client.getValue(), type));
System.out.println("lockdownd_query_type: " + type.getValue());
System.out.println("lockdownd_pair error code: " + lockdownd_pair(client.getValue(), Pointer.NULL));

每当我尝试获取任何字符串值时,它都会输出以下奇怪的问号字符:

idevice_new error code: 0
lockdownd_client_new error code: 0
idevice_get_udid error code: 0
udid: ��AZ�
lockdownd_query_type error code: 0
lockdownd_query_type: �HbZ�
lockdownd_pair error code: 0

每次字符都不同。

以防您看不到它:

program output

1 个答案:

答案 0 :(得分:3)

UUID每次都会更改,因为它是唯一的!每个新生成的都是不同的。

对于奇怪的字符,这里的罪魁祸首是uuid(还有type)到StringByReference的映射,因为您没有以这种格式获取数据本地存储。

C中的方法签名(您应该随问题发布)指出uuid的类型为**char,它是指向8位C值字符串的指针。深入研究源代码,似乎它们是字符串表示形式的数字0-9和A-F,并带有32个字节(不带连字符)或36个字节(带)以及空终止符。 (请注意,这并不总是很明显;它们可能已经以16字节的全字节值存储,这是API应该实际记录的内容。)

在内部,StringByReference类使用Pointer.getString()方法:

public String getValue() {
    return getPointer().getString(0);
}

仅带有偏移量的getString() method使用平台的默认编码,该编码可能是多字节字符集。这可能与UUID的8位编码不匹配(在您的情况下,显然不匹配)。

您应该将UUID映射为PointerByReference,并使用uuid.getValue().getString(0, "UTF-8")uuid.getValue().getString(0, "US-ASCII")来获取String作为它们表示的8位字符。

(或者,您可以获取一个字节数组并从中创建一个String,尽管我不确定是否会得到32或36字节的结果,所以如果走那条路就很有趣。有趣的是,您可以迭代偏移量并逐字节读取直到得到0。但是我离题了。)

留给type字段做同样的事情作为练习给读者。