【发布时间】:2019-03-27 10:09:21
【问题描述】:
我有以下 C 结构:
typedef struct {
void *instance;
const info_st *info;
} core_st;
我使用 JNA 映射到以下 Java 类:
public class core_st extends Structure {
public Pointer instance;
public info_st.ByReference info;
@Override
protected List<String> getFieldOrder() {
return Arrays.asList("instance", "info");
}
}
我还从 dll 中获取了以下函数:
uint32_t open_core(uint32_t core_id, core_st **core);
以及相关的JNA映射:
int open_core(int core_id, core_st[] core);
最后,我写了一个java程序,这样调用函数:
core_st[] cores = new core_st[1];
MyLibrary.INSTANCE.open_core(0, cores);
该函数应使用“打开”操作的结果填充cores[0] 成员。特别是,这两个字段是指向其他东西的两个指针。发生的情况是 void *instance 字段始终正确填充,但 info 字段始终为空(指向零的指针)。
如果我将 jna.memory_dump 选项设置为 true,任何对 core_st.toString() 的调用都会返回相同的结果:
memory dump
[70cb64e7]
[fd7f0000]
[00000000]
[00000000]
看起来指向 info 结构的指针不在 JNA 读取的内存中。由类似的 C 程序执行的相同调用工作正常,两个指针都正确填充。 我还尝试更改 core_st 映射,仅用于测试目的:
public class core_st extends Structure {
public long instance;
public long info;
@Override
protected List<String> getFieldOrder() {
return Arrays.asList("instance", "info");
}
}
但我的结果没有任何差异。 instance 获取非空值,info 始终为空。我正在使用 64 位 VM。 我想知道问题是否可能是 info 字段的 const 修饰符?指针类型的struct字段中的const修饰符可以改变struct在内存中的存储方式吗?
【问题讨论】: