如何在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类具有setPointergetPointer方法以允许多个间接,而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)); }