2013-02-28 9 views
5

Ich habe ein wirklich großes Problem hier. Ich versuche ein Byte [] von Java nach C++ zu übergeben und bekomme nach der Konvertierung negative Werte. Ich habe das Problem durch eindeutige Zeichen im Java-Byte [] festgestellt, die nach dem Konvertieren und Ausführen eines Protokolls entweder 0 oder negativ sind.Konvertierung von JNI Java-Byte [] nach C++ Bytearray, Rückgabe 0

Ich habe versucht, ein Test-Byte [] von String-Zeichen und es funktioniert gut.

Hier ist mein Code, wenn es hilft.

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

Ausgabe

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

, einen einfachen Test Byte mit [] 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); 
    } 

Ausgabe

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

Vielen Dank für Ihre Hilfe. Sehr geschätzt.

Antwort

1

Wie erhalten Sie die byte[] Array im Problemfall? Ist das auch eine Konvertierung von String? Wenn dies der Fall ist, kann das Ermitteln von Nullen und negativen Werten in Ihrer Protokollausgabe perfekt sein. Dies hängt von den eingegebenen Zeichen und der Codierung ab, die Sie zum Konvertieren in ein Byte-Array verwenden. Wenn Sie String.getBytes() wie mit Ihrem einfachen Text verwenden, verwenden Sie die Standardkodierung der Plattform. Ihr einfacher Fall zeigt, dass die Standardcodierung etwas ASCII-kompatibel ist.

+0

Danke für die Antwort. Nein, ich bekomme das Byte [] nicht von einer String-Konvertierung. Das Byte [] wird von einer anderen Quelle weitergegeben. Ich konnte es auf Java-Seite für Protokollierungszwecke in String konvertieren und sah, dass es eindeutige Zeichen enthielt. Sie erwähnten verschiedene Kodierungen. Wie setze ich eine andere Kodierung als die Standard-Plattform? – user2117849

+0

Verwenden Sie [String.getBytes (Zeichensatz)] (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#getBytes (java.nio.charset.Charset)). –

1

Ich bin mir nicht sicher, was Sie denken, das Problem ist hier. In Java ist byte ein signierter Typ, daher ist ein negativer Wert nicht unerwartet. Jbyte ist vermutlich ein 8-Bit-C++ - Typ mit Vorzeichen, der übereinstimmt.

Die wahrscheinlichsten Erklärungen sind:

  • Dieses ist etwas Artefakt der Art und Weise ist, dass Sie die Byte-Array erstellen; z.B. Sie haben in UTF-8 codiert (obwohl die sonst Null, um anzuzeigen, würde dazu neigen, ...)

  • Sie haben den Wert des size Parameter falsch geworden:

    • Aus irgendeinem Grund es größer ist als die Byte-Array-Größe.

    • Der Prozess, der Stuff in das Byte-Array geschrieben hat, hat size Bytes nicht hineingelegt.


Es ist erwähnenswert, dass Ihr JNI Code nicht, dass 0 <= size < message.length überprüft. Wenn diese Methode mit einem size-Argument aufgerufen wird, das außerhalb des zulässigen Bereichs liegt, können schlimme Dinge passieren ... einschließlich Segmentierungsfehler, die zu einem harten JVM-Absturz führen würden.

+0

danke Stephen für die Antwort, nein, ich habe eine Überprüfung, um sicherzustellen, dass die Größe korrekt ist. Allerdings habe ich in meinem Beitrag (seit editiert) nicht erwähnt, dass ich das konvertierte Array auf ein uint8_t gewirkt habe. Könnte das das Problem sein, warum das Empfangsende nur bis zur Nachricht bis 0 lesen kann? Unterstützt uint8_t 0 und negative Werte? – user2117849

+0

Die Werte für 'uint8_t' liegen zwischen 0 und 255. Da es sich jedoch um eine C/C++ - Umwandlung handelt, * teilen * Sie dem Code mit, die Werte im Array als unsigniert zu behandeln. Wie auch immer, basierend auf den Updates glaube ich nicht, dass das Problem in dem Code liegt, den Sie uns gezeigt haben. –