簡體   English   中英

如何正確地將 java 中的字節數組轉換為 jni 中的 char 指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM