可以将Java数组传递给采用数组的C / C ++函数吗?

时间:2016-11-04 09:44:37

标签: java c++ c arrays java-native-interface

我现在正在了解JNI。假设我有一个C / C ++库函数,它将int *数组作为输入(我们假设int是4个字节并且像在Java中一样签名),也就是说,一个数组作为指针传递。是否可以通过JNI将int的Java数组传递给这样的函数,而不进行任何复制(显然我们在这样做时删除了Java数组的长度部分)?直接ByteBuffer是唯一可行的方法吗?

1 个答案:

答案 0 :(得分:2)

直接ByteBuffer是避免复制的一种方法,正如你自己提到的那样。

如果你传递一个Java数组,你需要调用Get<Primitive>ArrayElements,这可能是或者可能不是复制(或Get<Primitive>ArrayRegion,但这是没有意义的,因为它总是副本)。

如果您只需要在短时间内访问元素,并且在释放元素之前不需要执行任何其他JNI调用,那么您还可以使用GetPrimitiveArrayCritical。 <{1}}“更有可能”不复制。

一个例子:

Get<Primitive>ArrayElements

请参阅Oracle's JNI documentation