我在這裏遇到了一個很大的問題。我試圖從Java傳遞一個byte []到C++,並且在轉換後我得到負值。我已經確定了Java字節[]中具有唯一字符的問題,該字符在轉換並執行日誌後,值爲0或負值。將JNI Java byte []轉換爲C++ bytearray,返回0
我已經嘗試使用字符串測試字節[],它工作正常。
這是我的代碼,如果有幫助。
爪哇
public static native void SendMessage(byte[] message, int size); //size = message.length
C++
static void SendMessage(JNIEnv *env, jclass cls, jbyteArray array, jint array_length)
{
jbyte* content_array = (env)->GetByteArrayElements(array,NULL);
//*env->GetByteArrayRegion(array,0,array_length,content_array); //tried this as well, same results
LOGD("content:\n");
for (int i=0; i < array_length; i++)
{
LOGD("%d",content_array[i]);
}
//EDIT
SendMessage(client, (uint8_t*)content_array, array_length); //<- could the problem be at the point where I convert it to uint8_t?
(env)->ReleaseByteArrayElements(array,content_array,0);
}
輸出
content: 48
content: 23
content: 13
content: 56
content: 0 // <--- the problem starts here
content: -122
content: 0
content: 78
content: 32
content: -28
etc...
..
..
現在,使用一個簡單的測試字節[] 爪哇
String test = "ABC";
byte[] message = test.getBytes();
public static native void SendMessage(byte[] message, int size); //size = message.length
C++
static void SendMessage(JNIEnv *env, jclass cls, jbyteArray array, jint array_length)
{
jbyte* content_array = (env)->GetByteArrayElements(array,NULL);
//*env->GetByteArrayRegion(array,0,array_length,content_array); //tried this as well, same results
LOGD("content:\n");
for (int i=0; i < array_length; i++)
{
LOGD("%d",content_array[i]);
}
(env)->ReleaseByteArrayElements(array,content_array,0);
}
輸出
content: 65 //this works perfectly
content: 66
content: 67
感謝您的幫助。非常感激。
感謝您的回覆。不,我沒有從字符串轉換中獲取字節[]。字節[]從另一個來源傳遞。爲了記錄目的,我能夠將它轉換爲Java端的String,並且看到它包含唯一的字符。 你提到過不同的編碼。如何從平臺默認設置不同的編碼? – user2117849 2013-02-28 03:27:23
使用[String.getBytes(Charset)](http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#getBytes(java.nio.charset.Charset))。 – 2013-02-28 03:30:08