如何在 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 只是一个围绕长(地址)的小包装,因此您可以使用它们而无需在周围复制数组
我有一个混合了 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 只是一个围绕长(地址)的小包装,因此您可以使用它们而无需在周围复制数组