我现在正在学习 JNI。假设我有一个 C/C++ 库函数,它将 int* 数组作为输入(我们假设 int 是 4 个字节,并且像在 Java 中一样有符号),也就是说,一个数组作为指针传递。是否可以通过 JNI 将 Java 数组 int 传递给这样的函数,而不进行任何复制(显然我们在这样做时删除了 Java 数组的长度部分)?直接 ByteBuffer 是做这些事情的唯一可行方法吗?
最佳答案
直接ByteBuffer
正如您自己提到的那样,这将是避免复制的一种方式。
如果传递 Java 数组,则需要调用 Get<Primitive>ArrayElements
,它可能也可能不复制(或 Get<Primitive>ArrayRegion
,但这没有任何意义,因为它总是复制)。
还有 GetPrimitiveArrayCritical
如果您只需要在“短”时间内访问元素,并且在释放元素之前不需要执行任何其他 JNI 调用,则可以使用它。它比 Get<Primitive>ArrayElements
“更有可能”不复制。
一个例子:
jint len = env->GetArrayLength(myIntArray);
jint *elements = env->GetPrimitiveArrayCritical(myIntArray, NULL);
// Use elements...
env->ReleasePrimitiveArrayCritical(myIntArray, elements, 0);
关于java - 可以将 Java 数组传递给采用数组的 C/C++ 函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40419466/