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.
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
Verwenden Sie [String.getBytes (Zeichensatz)] (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#getBytes (java.nio.charset.Charset)). –