Ich hatte dieses Problem, wenn ich die Datei Application.mk
ändereAus dieser Zeile:
%Vor%An:
%Vor%Sobald ich es wieder zurücksetzte, behob es das Problem.
So habe ich das gemacht.
1- Char Array zu JByteArray.
2- JByteArray zu JString.
3- Geben Sie jstring an die Java-Seite zurück.
JNI-Code; (.c) format
%Vor%Java-Code;
%Vor%Andere Vorgehensweise funktioniert nicht für mich;
Ich habe auch versucht, %code% , aber einige Zeichen, die nicht im Char-Array, am Ende der Zeichenfolge, wo mit der Warnung JNI WARNUNG: Eingabe ist nicht gültig Modified UTF-8: illegale Fortsetzung Byte 0x40 .
Beispiel; PKdhtXMm18n2L9K DL- DL
Bearbeiten:
C ++ Version
%Vor%Für mich bestand die Lösung darin, den Inhalt auf ein const char * zu setzen:
%Vor%und die Funktion:
%Vor%Zeichenfolgen, die Sie an NewStringUTF () übergeben, müssen gültig sein UTF-8 . Es sieht so aus, als ob die von Ihrer Funktion start_Inauthroot () zurückgegebene Zeichenfolge in einer anderen Codierung enthalten ist oder nur eine ungültige Zeichenfolge zurückgibt. Sie müssen die Zeichenfolge in UTF-8 konvertieren, bevor Sie sie an JNI-Funktionen übergeben. Oder Sie können einen der Zeichensatz-bewusste String-Konstruktoren , um stattdessen das String-Objekt zu erstellen.
Das funktioniert für mich in C ++
%Vor%Meiner Meinung nach ist es kein Fehler.
NewStringUTF Konstruiert ein neues java.lang.String-Objekt aus einem Array von Zeichen in der modifizierten UTF-8 -Codierung.
Modifiziertes UTF-8 ist kein Standard-UTF-8. Siehe Modified UTF-8
In den meisten Fällen ist die UTF-8-codierte Zeichenfolge gültig Modified UTF-8. Weil Modified UTF-8 und UTF-8 sehr ähnlich sind. Wenn es jedoch zu einer Unicode-Zeichenfolge außerhalb der Basic Multilingual Plane kommt, sind sie nicht kompatibel.
Lösung: Übergeben Sie UTF-8-Bytes an die Java-Ebene und die neue Zeichenfolge (Bytes, "UTF-8") und übergeben Sie dann jstring an JNI.
Die Ursache dieses Problems steht in direktem Zusammenhang mit einem bekannten UTF- 8 Fehler in der NDK / JNI GetStringUTFChars () Funktion (und wahrscheinlich verwandte Funktionen wie NewStringUTF). Diese NDK-Funktionen konvertieren keine zusätzlichen Unicode-Zeichen (dh Unicode-Zeichen mit einem Wert von U + 10000 und oben) richtig. Dies führt zu falschem UTF-8 und nachfolgenden Abstürzen.
Ich habe den Absturz bei der Verarbeitung von Text mit Emoticon-Zeichen festgestellt ( siehe das entsprechende Unicode-Diagramm ) ). Emoticon-Zeichen liegen im Unicode-Zeichenbereich.
Analyse des Problems
Es gibt einen bekannten NDK-Fehler , wobei GetStringUTFChars ( ) konvertiert zusätzliche Unicode-Zeichen falsch und erzeugt eine falsche und ungültige UTF-8-Sequenz.
In meinem Fall war die resultierende Zeichenfolge ein JSON-Puffer. Wenn der Puffer an den JSON-Parser übergeben wurde, ist der Parser sofort fehlgeschlagen, weil eines der UTF-8-Zeichen des extrahierten UTF-8 ein ungültiges UTF-8-Präfix-Byte hatte.
Mögliche Abhilfe
Die Lösung, die ich verwendet habe, kann wie folgt zusammengefasst werden:
Auf diese Weise umgehen wir das Problem, zusätzliche Unicode-Zeichen aus der Java-Zeichenkette zu extrahieren. Stattdessen konvertieren wir die Daten vor dem Aufruf von GetStringUTFChars () in Base-64 ASCII, extrahieren die Base-64-ASCII-Zeichen mithilfe von GetStringUTFChars () und konvertieren die Base-64-Daten zurück in Wide-Zeichen.
Ich habe dieses Problem gelöst, indem ich ein Byte-Array anstelle von String zurückgegeben habe. Auf der Java-Seite konvertiere ich jetzt das Byte-Array in Strings. Funktioniert gut! Vermeiden Sie die Verwendung von NewStringUTF () für Android 4.0 und höher, da bereits ein Fehler auf Google Android NDK gemeldet wurde.
Ich habe dieses Problem gelöst, indem ich ein Byte-Array anstelle von String zurückgegeben habe. Auf der Java-Seite konvertiere ich jetzt das Byte-Array in Strings. Funktioniert gut! Vermeiden Sie die Verwendung von NewStringUTF () für Android 4.0 und höher, da bereits ein Fehler auf Google Android NDK gemeldet wurde.
Die Ursache dieses Problems steht in direktem Zusammenhang mit einem bekannten UTF- 8 Fehler in der NDK / JNI GetStringUTFChars () Funktion (und wahrscheinlich verwandte Funktionen wie NewStringUTF). Diese NDK-Funktionen konvertieren keine zusätzlichen Unicode-Zeichen (dh Unicode-Zeichen mit einem Wert von U + 10000 und oben) richtig. Dies führt zu falschem UTF-8 und nachfolgenden Abstürzen.
Ich habe den Absturz bei der Verarbeitung von Text mit Emoticon-Zeichen festgestellt ( siehe das entsprechende Unicode-Diagramm ) ). Emoticon-Zeichen liegen im Unicode-Zeichenbereich.
Analyse des Problems
Es gibt einen bekannten NDK-Fehler , wobei GetStringUTFChars ( ) konvertiert zusätzliche Unicode-Zeichen falsch und erzeugt eine falsche und ungültige UTF-8-Sequenz.
In meinem Fall war die resultierende Zeichenfolge ein JSON-Puffer. Wenn der Puffer an den JSON-Parser übergeben wurde, ist der Parser sofort fehlgeschlagen, weil eines der UTF-8-Zeichen des extrahierten UTF-8 ein ungültiges UTF-8-Präfix-Byte hatte.
Mögliche Abhilfe
Die Lösung, die ich verwendet habe, kann wie folgt zusammengefasst werden:
Auf diese Weise umgehen wir das Problem, zusätzliche Unicode-Zeichen aus der Java-Zeichenkette zu extrahieren. Stattdessen konvertieren wir die Daten vor dem Aufruf von GetStringUTFChars () in Base-64 ASCII, extrahieren die Base-64-ASCII-Zeichen mithilfe von GetStringUTFChars () und konvertieren die Base-64-Daten zurück in Wide-Zeichen.
So habe ich das gemacht.
1- Char Array zu JByteArray.
2- JByteArray zu JString.
3- Geben Sie jstring an die Java-Seite zurück.
JNI-Code; (.c) format
%Vor%Java-Code;
%Vor%Andere Vorgehensweise funktioniert nicht für mich;
Ich habe auch versucht, return (*env)->NewStringUTF(env, r)
, aber einige Zeichen, die nicht im Char-Array, am Ende der Zeichenfolge, wo mit der Warnung JNI WARNUNG: Eingabe ist nicht gültig Modified UTF-8: illegale Fortsetzung Byte 0x40 .
Beispiel; PKdhtXMm18n2L9K DL- DL
Bearbeiten:
C ++ Version
%Vor%Zeichenfolgen, die Sie an NewStringUTF () übergeben, müssen gültig sein UTF-8 . Es sieht so aus, als ob die von Ihrer Funktion start_Inauthroot () zurückgegebene Zeichenfolge in einer anderen Codierung enthalten ist oder nur eine ungültige Zeichenfolge zurückgibt. Sie müssen die Zeichenfolge in UTF-8 konvertieren, bevor Sie sie an JNI-Funktionen übergeben. Oder Sie können einen der Zeichensatz-bewusste String-Konstruktoren , um stattdessen das String-Objekt zu erstellen.
Meiner Meinung nach ist es kein Fehler.
NewStringUTF Konstruiert ein neues java.lang.String-Objekt aus einem Array von Zeichen in der modifizierten UTF-8 -Codierung.
Modifiziertes UTF-8 ist kein Standard-UTF-8. Siehe Modified UTF-8
In den meisten Fällen ist die UTF-8-codierte Zeichenfolge gültig Modified UTF-8. Weil Modified UTF-8 und UTF-8 sehr ähnlich sind. Wenn es jedoch zu einer Unicode-Zeichenfolge außerhalb der Basic Multilingual Plane kommt, sind sie nicht kompatibel.
Lösung: Übergeben Sie UTF-8-Bytes an die Java-Ebene und die neue Zeichenfolge (Bytes, "UTF-8") und übergeben Sie dann jstring an JNI.
Tags und Links android android-ndk jni android-4.0 android-ndk-r7