【发布时间】:2020-09-03 13:21:38
【问题描述】:
我有一个混合 Java 和 C 的代码,我需要将 Java 代码的 byte[] 传递给 C 代码来完成一些计算。我在 JNI 中使用以下代码将 byte[] 转换为 char*(env is JNIEnv * of三):
jboolean is_copy = JNI_TRUE;
char *native_byte_array = (char *) (*env)->GetByteArrayElements(env, byte_array, &is_copy);
我完成了 char* 类型的计算,返回值也有 char* 类型,我想用 jbyteArray 返回一个值,所以我可以在 Java 中的 byte[] 类型中使用它。我在 JNI 中尝试了以下代码( env 是 C) 的 JNIEnv *:
jbyteArray java_buffer = (*env)->NewByteArray(env, buffer_size);
(*env)->SetByteArrayRegion(env, java_buffer, 0, buffer_size, (const jbyte *) native_buffer);
NewByteArray 似乎会创建一个新的 byte[] 实例,而 SetByteArrayRegion 会将数据复制到新创建的 byte[] 中。 但是,如果我有一个需要转换为字节 [] 的大返回值,则效率不高。 那么,有没有一种方法可以在没有 malloc 新内存的情况下创建一个 jbyteArray 实例并使其指向 char* 区域?
【问题讨论】:
标签: java c java-native-interface