JNI: How to pass "unsigned char*" von C++ zu java
Habe ich ein "unsigned char *" und ich will es pass auf den Java-code mittels JNI
Ich habe es versucht, in der folgenden Weise
jstring test1;
std::string str(reinterpret_cast<const char*>(ucptest));
test1 = env->NewStringUTF(str.c_str());
wo 'ucptest' ist 'unsigned char *' und hat die ascii-Werte.
dieser code funktioniert und ich kann erfolgreich zu bestehen, jstring, die Java-code, aber in den Last call, den ich sehe, Absturz in der JVM.
Was könnte der mögliche Grund für den crash? Absturz Unstimmigkeiten, was bedeuten könnte, dass Speicher Korruption.
Kann jemand empfehlen, einen besseren Weg, um pass 'unsigned char*' in Java?
jede Hilfe ist willkommen.
Dank
- Sie versuchen, eine Zeichenfolge übergeben, nicht einen Zeiger, der auf so so zu sagen. Wird ein Zeiger übergeben, in Java wäre so einfach wie Gießen es in einen integer, aber das wäre sinnlos, weil Java-code, der konnte nichts mit dem Mauszeiger.
- Nein, ich habe legacy-code mit " unsigned char*", die ich übergeben muss java
- ist ucptest Null beendet?
- ucptest ist nicht null-terminiert, aber ich habe eine Länge variable als Teil der gleichen Struktur als ucptest und ich Lesen werden, nur len char ' s aus ucptest.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich die Lösung gefunden, und dachte, ich würde teilen die gleichen, so dass andere es nutzen können.
Zunächst war ich konvertieren
char*
zu C++ - String und übergeben Sie es an JavaString
. Das war gut funktioniert, bis wir das hatten, "0" in der Zeichenfolge, ich war versuchen zu konvertieren. Dies verursachte einen Absturz.Schließlich habe ich ein byte-array auf den Wert server. Diese funktioniert perfekt.
Sehe ich nicht, warum Ihr das hinzufügen der zusätzlichen casting-Schritt -, java-strings sind unicode
unsigned char *
oderwchar_t *
oderstd::wstring().c_str()
verwendet werden können, mehr direkt.Den
std::string
constructor Sie verwenden, erwartet einen null-terminierten c-string. Der Konstruktor wird zu Lesen, bis es findet ein nul-Zeichen, dies kann den Absturz verursachen. Sollten Sie eine andere Konstruktor, wenn Ihr string ist nicht null beendet (std::string(char*,size_t)
).In deinem Fall Zeile
env->NewStringUTF(str.c_str());
muss sich im bedingten block für die überprüfunggetStaticMethodInfo
:code kann gestaltet werden als: