2013-02-28 74 views
5

我在這裏遇到了一個很大的問題。我試圖從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 

感謝您的幫助。非常感激。

回答

1

你是如何獲得問題案例中的byte[]數組?那也是從String轉換而來嗎?如果是這樣,在日誌輸出中獲得零和負值可能是完全有效的。它取決於您用來轉換爲字節數組的輸入字符和編碼。如果您使用String.getBytes()與簡單文本一樣,則將使用平臺默認編碼。你的簡單案例表明默認編碼是ASCII兼容的。

+0

感謝您的回覆。不,我沒有從字符串轉換中獲取字節[]。字節[]從另一個來源傳遞。爲了記錄目的,我能夠將它轉換爲Java端的String,並且看到它包含唯一的字符。 你提到過不同的編碼。如何從平臺默認設置不同的編碼? – user2117849 2013-02-28 03:27:23

+0

使用[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

1

我不確定你認爲問題在這裏。在Java中,byte是簽名類型,所以負值不是意外。 Jbyte大概是一個匹配的8位有符號C++類型。

最有可能的解釋是:

  • 這是你創建的字節數組的方式有些假象;例如您在UTF-8編碼的(雖然零往往會以其他方式來表示......)

  • 你已經得到了size參數不正確的值:

    • 出於某種原因,它更大比字節數組大小。

    • 將東西寫入字節數組的過程未將size字節放入其中。


值得注意的是,你的JNI代碼不檢查0 <= size < message.length。如果使用size參數調用此方法超出範圍,則可能發生壞事......包括分段錯誤,這將導致硬件JVM崩潰。

+0

謝謝斯蒂芬的回覆,不,我做了一個檢查,以確保大小是正確的。但是,我沒有在我的文章(自編輯)中提到我已經將轉換後的數組轉換爲uint8_t。難道這就是接收端只能讀取消息直到0的問題嗎? uint8_t是否支持0和負值? – user2117849 2013-02-28 05:28:53

+0

'uint8_t'的取值範圍爲0到255.然而,由於這是一個C/C++類型轉換,因此您會*告訴代碼將數組中的值視爲無符號數。無論如何,基於更新,我認爲這個問題不在您向我們展示的代碼中。 – 2013-02-28 06:06:55

相關問題