如何在Java中获得新的指针?

时间:2010-11-27 22:30:20

标签: java c pointers jna

如何从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;

3 个答案:

答案 0 :(得分:9)

似乎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

答案 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));
}