java—如何在jni中将char*转换为jbytearray,而不使用malloc新的内存区域

ni65a41a  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(289)

我有一个java和c混合的代码,我需要把java代码的一个字节[]传递给c代码来完成一些计算,我在jni中使用下面的代码将字节[]转换成char*(env是c的jnienv*):

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[]中。但是,如果我有一个需要转换为byte[]的大返回值,这是没有效率的。那么,有没有一种方法可以在没有malloc新内存的情况下创建jbytearray示例,并使其指向char*区域?

eiee3dmh

eiee3dmh1#

你可以用 NewDirectByteBuffer . (我知道,它与字节[]不同,但它非常接近)返回:

//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
}

这些directbytebuffers是简化的,只是一个长(地址)的小 Package 器,因此您可以使用它们,而无需复制周围的数组

相关问题