我有一个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*区域?
1条答案
按热度按时间eiee3dmh1#
你可以用
NewDirectByteBuffer
. (我知道,它与字节[]不同,但它非常接近)返回:通过:
这些directbytebuffers是简化的,只是一个长(地址)的小 Package 器,因此您可以使用它们,而无需复制周围的数组