能否将Java数组传递给C/C++;取数组的函数?

能否将Java数组传递给C/C++;取数组的函数?,java,c++,c,arrays,java-native-interface,Java,C++,C,Arrays,Java Native Interface,我现在正在学习JNI。假设我有一个C/C++库函数,它以int*array作为输入(我们假设int有4个字节,并且与Java中一样有符号),也就是说,数组作为指针传递。是否可以通过JNI将int的Java数组传递给这样的函数,而不进行任何复制(显然,我们在这样做时删除了Java数组的长度部分)?直接ByteBuffer是做这类事情的唯一可行方法吗?直接ByteBuffer是避免复制的一种方法,正如你提到的那样 如果传递Java数组,则需要调用GetArrayElements,该数组可以复制也可以

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

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

如果传递Java数组,则需要调用
GetArrayElements
,该数组可以复制也可以不复制(或者
GetArrayRegion
,但这没有意义,因为它总是复制)

还有
GetPrimitiveArrayCritical
,如果您只需要在“短”时间内访问元素,并且在释放元素之前不需要执行任何其他JNI调用,就可以使用它。与
GetArrayElements
相比,“更有可能”不复制

例如:

jint len = env->GetArrayLength(myIntArray);
jint *elements = env->GetPrimitiveArrayCritical(myIntArray, NULL);

// Use elements...

env->ReleasePrimitiveArrayCritical(myIntArray, elements, 0);  

请参阅。

正如您提到的,直接的
字节缓冲将是避免复制的一种方式

如果传递Java数组,则需要调用
GetArrayElements
,该数组可以复制也可以不复制(或者
GetArrayRegion
,但这没有意义,因为它总是复制)

还有
GetPrimitiveArrayCritical
,如果您只需要在“短”时间内访问元素,并且在释放元素之前不需要执行任何其他JNI调用,就可以使用它。与
GetArrayElements
相比,“更有可能”不复制

例如:

jint len = env->GetArrayLength(myIntArray);
jint *elements = env->GetPrimitiveArrayCritical(myIntArray, NULL);

// Use elements...

env->ReleasePrimitiveArrayCritical(myIntArray, elements, 0);  

请参阅。

因此,基本上,直接ByteBuffer是实现这一点的唯一可靠方法?我想是的,除非你只针对一个特定的VM,你知道它的行为方式。因此,基本上,直接ByteBuffer是实现这一点的唯一可靠方法?我想是的,除非你只是针对一个特定的虚拟机,你知道它的行为方式。