[英]How to convert ArrayList<byte[]> to vector<char[]> for JNI?
[英]how to properly convert byte array in java to char pointer in jni
我是 C/C++ 新手,所以我不知道如何將 Java 中的字節數組正確轉換為 JNI 中的 char 數組。
例如,我有一個包含"Hello world!"
的inputString
。 ,我用它來獲取字節數組:
byte[] data = inputString.getBytes();
然后在 JNI 層,我使用:
jbyte *array = (*env)->GetByteArrayElements(env, data, &isCopy);
argv[1] = (char *)array;
然后當我打印argv[1]
時,它是"Hello world!ZE"
。
為什么這里有多余的字符"ZE"
?
有人能解釋一下,並為我提供將byte[]
轉換為char*
指針的正確解決方案嗎? 我需要char*
指針,因為給我的接口對我來說是char*
指針。
您的byte[]
數組不是以空值結尾的(不以0x00
字節結尾),但您顯然將其視為是。 打印字節時,當打印訪問超出數組邊界時,“額外”字符是來自周圍 memory 的隨機值,這是未定義的行為。
使用(*env)->GetArrayLength()
找出數組中實際有多少字節,然后不要訪問比這更多的字節,例如:
jint len = (*env)->GetArrayLength(env, data);
jbyte *array = (*env)->GetByteArrayElements(env, data, &isCopy);
argv[1] = (char*) array;
...
printf("%.*s", len, argv[1]);
...
(*env)->ReleaseByteArrayElements(env, data, array, JNI_ABORT);
如果你真的需要一個以空字符結尾的字符串,你將不得不為你自己的char[]
緩沖區分配一個額外的空間來放置一個終結符,然后將byte[]
數組數據復制到那個緩沖區中,例如:
jint len = (*env)->GetArrayLength(env, data);
jbyte *array = malloc(len + 1);
if (array) {
(*env)->GetByteArrayRegion(env, data, 0, len, array);
array[len] = 0x00;
}
argv[1] = (char*) array;
...
printf("%s", argv[1]);
...
free(array);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.