我有一个像这样的 native 函数。它是专有 DLL 的一部分,我无法修改。
void foo(char* src, size_t len);
在Java中,我有一个像这样的普通数组:byte[] array = makeArray();
数组必须位于堆上,而不是位于 native 内存中,原因超出了这个问题的范围。
如果我想使用整个数组调用 foo
,我可以这样做,并且它已经在我的软件中运行:
libraryWrapper.foo(array, array.length);
但是,我想单步执行这个数组并对其进行 foo 处理,如下所示:
for(int i = 0; i <= array.length - 10000; i += 10000)
libraryWrapper.foo(array + i, 10000);
有没有办法使用 JNA 实现这种“指针算术”,而不使用中间内存
或编写另一个 DLL?
最佳答案
您可以使用ByteBuffer.wrap()
与你的完整阵列。当您将该缓冲区传递给 native 代码时,JNA 将使用缓冲区的当前偏移量生成指向数组的 native 指针。
您可以在每次调用时换行,也可以根据需要使用 .position(int)
操作缓冲区的偏移量。 .
或者,将较小的数组传递给 native 代码,然后将结果复制到主存储。
关于java - 如何在 JNA 中向 java 数组添加偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32948249/