如何在Java中获得新的指针?
如何在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;
似乎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
Java中没有指针,只有引用。
将引用传递给方法时,无法重新分配引用,因为您按值传递它们。 Java中的所有内容都是通过值传递的。
您可以重写此方法以实例化设备的新实例并返回该实例而不是int。
更好的答案。 您可能希望根据Java String长度分配(malloc等)。 以下示例是JNA项目的unit testing。
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)); }