2010-11-27 78 views
7

如何从JNA调用C中的此方法签名的方法?如何获取Java中的新指针?

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

只是好奇:你的更新代码是否适合你?看起来好像你正在设置`* p = p2`,但是然后C函数会执行`* p = pdev`,从而覆盖这个值。 – casablanca 2010-11-28 15:38:10

+0

@casablanca:是的,我测试过它,它的工作原理。 – thejh 2010-11-28 19:58:15

+0

@thejh你知道如何处理由于指向无效内存地址而创建的invalidMemoryAccess异常吗? – mayooran 2015-11-12 05:55:23

回答

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 
0

在Java中没有指针,仅引用。

当您将它们传递给方法时,您无法重新分配引用,因为您通过值传递它们。所有东西都通过Java传递。

您可以重写此方法来实例化设备的新实例,并返回该实例而不是int。

0

更好的答案。您可能需要根据Java字符串长度来分配(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)); 
}