我拥有下一个C函数:
int fillWithNames(const char*** names, int *n);
我使用JNA转换为java,如下所示:
public interface PlayersLibrary extends Library {
PlayersLibrary INSTANCE = (PlayersLibrary) Native.loadLibrary("player", PlayersLibrary.class);
int fillWithNames(PointerByReference names, IntByReference n);
}
如何打印此方法在names
中返回的字符串?
我想做这样的事情:
PlayersLibrary.INSTANCE.fillWithNames(names, n);
Pointer first = names.getValue(); // char**
String a = first.getPointer(0).getValue() // char*
System.out.println(a);
但在这种情况下,names.getValue()
返回null,我不知道该怎么做
我该怎么做才能解决这个问题?
答案 0 :(得分:1)
使用names.getValue().getStringArray(0, n.getValue()])
。
我推断n
参数告诉被叫方要填写多少个名称。getStringArray()
会将内存中的连续指针值转换为字符串,直到遇到{{1}价值;如果你的被叫方没有以NULL
指针终止,你需要明确地告诉它有多少指针需要读取(表面上是NULL
参数调用n
)。
修改强>
因此长度确实会回到fillWithNames()
参数中。如果被调用者将零写入该参数,那么它会告诉您它没有名称(这就是为什么你在另一个参数中得到n
的原因)。
答案 1 :(得分:0)
表示对指向本机数据的指针的引用。用C表示法,
void**
。