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

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

我现在正在学习 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);  

参见 Oracle's JNI documentation .

关于java - 可以将 Java 数组传递给采用数组的 C/C++ 函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40419466/

相关文章:

java - 启动时将 Activity 及其布局放置在主 Activity 上

c++ - C++ 中查找子数组的模板函数

将 C 与 MongoDB 连接

java - 使用 Android 的 AudioTrack 类生成正弦波、方波、三角波、锯齿波音频信号

java - JDBC - 在哪里可以找到用于在 Linux(甚至 Windows)上读取 excel 文件 (.xml) 的 4 类 JDBC 驱动程序

Java - ArrayList - 访问对象字段

c - 使用指针替换 char 数组中的 char

c++ - 如何使用指向模板化类型的指针

c++ - 当我 printf 我的 vector 时,最后的 '%' 是什么?

交叉编译Raspberry pi 2错误