2013-02-28 38 views
5

Tôi thực sự là một vấn đề lớn ở đây. Tôi đang cố gắng để vượt qua một byte [] từ Java để C + + và tôi nhận được giá trị tiêu cực sau khi chuyển đổi. Tôi đã xác định vấn đề từ việc có các ký tự duy nhất trong byte Java [] sau khi chuyển đổi và thực hiện nhật ký, các giá trị là 0 hoặc âm.Chuyển đổi JNI Java byte [] thành C++ bytearray, trả về 0

Tôi đã thử sử dụng một byte thử nghiệm [] của các ký tự String và nó hoạt động tốt.

Đây là mã của tôi, nếu nó giúp.

Java

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); 
    } 

Output

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... 
.. 
.. 

Bây giờ, sử dụng một byte kiểm tra đơn giản [] Java

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); 
    } 

Output

content: 65 //this works perfectly 
content: 66 
content: 67 

Nhờ sự giúp đỡ của bạn. Nhiều đánh giá cao.

Trả lời

1

Bạn nhận được mảng byte[] trong trường hợp sự cố như thế nào? Đó cũng là một chuyển đổi từ một số String? Nếu vậy, việc nhận giá trị 0 và giá trị âm trong đầu ra nhật ký của bạn có thể hoàn toàn hợp lệ. Nó phụ thuộc vào các ký tự đầu vào và mã hóa bạn đang sử dụng để chuyển đổi thành một mảng byte. Nếu bạn đang sử dụng String.getBytes() như với văn bản đơn giản của mình, bạn sẽ sử dụng mã hóa mặc định nền tảng. Trường hợp đơn giản của bạn cho thấy rằng mã hóa mặc định là một cái gì đó tương thích ASCII.

+0

Cảm ơn bạn đã trả lời. Không, tôi không nhận được byte [] từ một chuyển đổi Chuỗi. Byte được truyền từ một nguồn khác. Tôi đã có thể chuyển đổi nó thành chuỗi ở phía Java cho mục đích ghi nhật ký và thấy rằng nó chứa các ký tự duy nhất. Bạn đã đề cập về mã hóa khác nhau. Làm cách nào để tôi đặt mã hóa khác từ nền tảng mặc định? – user2117849

+0

Sử dụng [String.getBytes (Charset)] (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#getBytes (java.nio.charset.Charset)). –

1

Tôi không chắc bạn nghĩ vấn đề ở đây là gì. Trong Java, byte là loại đã ký, vì vậy giá trị âm không phải là bất ngờ. Jbyte có lẽ là loại C++ có ký hiệu 8 bit để khớp.

Những lời giải thích rất có thể là:

  • Đây là một số vật phẩm của con đường mà bạn đang tạo các mảng byte; ví dụ. bạn đã được mã hóa theo UTF-8 (mặc dù không sẽ có xu hướng để chỉ định khác ...)

  • Bạn đã nhận được giá trị của tham số size không đúng:

    • Đối với một số lý do nó lớn so với kích thước mảng byte.

    • Quy trình đã ghi nội dung vào mảng byte không đặt size byte vào đó.


Nó là đáng chú ý rằng mã JNI của bạn không kiểm tra xem 0 <= size < message.length. Nếu phương pháp này được gọi với đối số size nằm ngoài phạm vi, những điều xấu có thể xảy ra ... bao gồm lỗi phân đoạn, điều đó sẽ dẫn đến sự cố JVM khó khăn.

+0

cảm ơn Stephen đã trả lời, không, tôi đã kiểm tra để đảm bảo rằng kích thước là chính xác. Tuy nhiên, tôi đã không đề cập đến trong bài viết của tôi (kể từ khi edited) mà tôi đã cast mảng được chuyển đổi thành uint8_t. Có thể đó là vấn đề tại sao kết thúc nhận chỉ có thể đọc cho đến khi tin nhắn lên đến 0? Uint8_t có hỗ trợ 0 và giá trị âm? – user2117849

+0

Các giá trị cho 'uint8_t' trong khoảng từ 0 đến 255. Tuy nhiên, vì đó là một diễn viên C/C++, bạn đang * nói * mã để xử lý các giá trị trong mảng là unsigned. Dù sao, dựa trên các bản cập nhật, tôi không nghĩ rằng vấn đề là trong mã bạn đã cho chúng tôi thấy. –

Các vấn đề liên quan