如何在 JNI 中将 char* 转换为 jbyteArray 而无需 malloc 一个新的内存区域

How to cast a char* to jbyteArray in JNI whitout malloc a new memory area

我有一个混合了 Java 和 C 的代码,我需要将 Java 代码的 byte[] 传递给 C 代码以完成一些 calculate.I 将 byte[] 转换为 char*通过在 JNI 中使用以下代码(env 是 C 的 JNIEnv *):

jboolean is_copy = JNI_TRUE;
char *native_byte_array = (char *) (*env)->GetByteArrayElements(env, byte_array, &is_copy);

我完成了 char* 类型的计算,return 值也有 char* 类型,我想 return 一个带有 jbyteArray 的值,这样我就可以在 [] 中的 byte[] 类型中使用它=19=] 在 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[] 中。 但是,如果我有一个很大的 return 值需要转换为 byte[],那么它就没有效率了。 那么,有没有一种方法可以创建一个jbyteArray实例而不用malloc new memory并使其指向char*区域?

您可以使用 NewDirectByteBuffer。 (我知道,它与 byte[] 不同,但它非常接近) 至 return:

//Do something...
char* result=...;
return (*env)->NewDirectByteBuffer(env, result, buffer_size);

通过:

JNIEXPORT jobject JNICALL Java_Foo_bar(JNIEnv* env,jclass cls, jobject buffer){
  char* bufferPassedFromJava=(*env)->GetDirectBufferAddress(env,buffer);//May return NULL
}

这些 DirectByteBuffer 只是一个围绕长(地址)的小包装,因此您可以使用它们而无需在周围复制数组