如何从JNA中用C调用此方法签名的方法?
int open_device(context *ctx, device **dev, int index);
C方法的最后两行如下所示:
*dev = pdev;
return 0;
这是该方法中唯一使用dev
的方法。这意味着我必须将一个poiner传递给指向该方法的空指针,对吧?然后该方法用device
对象的地址填充空指针,我可以将指针传递给设备到其他方法。
我的问题是:这是正确的方法吗?如果是,如何从Java分配新指针?
根据接受的答案,我这样做了:
Memory p = new Memory(Pointer.SIZE);
Memory p2 = new Memory(Pointer.SIZE);
p.setPointer(0, p2);
nativeLib.open_device(ctx, p, index);
return p2;
答案 0 :(得分:9)
似乎JNA Pointer
类有setPointer
和getPointer
方法允许多个间接,而Memory
类实际上“分配”本机对象。所以你应该能够做到这样的事情:(我只是从JNA文档猜测,我没有测试过这个)
Pointer pDev = new Memory(Pointer.SIZE); // allocate space to hold a pointer value
// pass pDev to open_device
Pointer dev = pDev.getPointer(0); // retrieve pointer stored at pDev
答案 1 :(得分:0)
Java中没有指针,只有引用。
将参考传递给方法时,无法重新分配参考,因为您按值传递它们。所有东西都是用Java传递的。
您可以重写此方法以实例化设备的新实例并返回该实例而不是int。
答案 2 :(得分:0)
更好的答案。您可能希望根据Java String长度分配(malloc等)。以下示例是JNA项目的单元测试。
public void testGetSetStringWithDefaultEncoding() throws Exception {
final String ENCODING = Native.DEFAULT_ENCODING;
String VALUE = getName();
int size = VALUE.getBytes(ENCODING).length+1;
Memory m = new Memory(size);
m.setString(0, VALUE);
assertEquals("Wrong decoded value", VALUE, m.getString(0));
}