2011-01-17 9 views
1

Ich habe einen ‚unsigned char *‘ und ich will es weitergeben an den Java-Code unter Verwendung von JNI ich es in der folgenden Art und Weise versucht haben,JNI: Wie „unsigned char *“ von C passieren ++ zu Java

jstring test1; 
std::string str(reinterpret_cast<const char*>(ucptest)); 
test1 = env->NewStringUTF(str.c_str()); 

wobei 'ucptest' 'unsigned char *' ist und Ascii-Werte enthält. dieser Code funktioniert und ich kann erfolgreich jstring an Java-Code übergeben, aber in der Ladung Anruf sehe ich Absturz in JVM.

Was könnte der mögliche Grund für den Absturz sein? Absturz ist Inkonsistenz, was Speicherkorruption bedeuten könnte.

Kann jemand eine bessere Möglichkeit vorschlagen, 'unsigned char *' an Java zu übergeben?

jede Hilfe wird geschätzt.

Dank

+1

Sie versuchen, eine Zeichenfolge übergeben, kein Zeiger , also sag es. Die Übergabe eines Zeigers an Java wäre so einfach wie das Umwandeln in eine Ganzzahl, aber das wäre nutzlos, weil Java-Code nichts mit dem Zeiger machen könnte. –

+0

Nein, ich habe Legacy-Code mit 'unsigned char *', den ich an Java übergeben muss – Vikas

+0

@ user578742 ist ucptest Null beendet? – josefx

Antwort

2

Ich fand die Lösung, und dachte, ich würde das gleiche teilen, damit andere es verwenden konnten.

Zunächst konvertierte ich char* in C++ String und dann übergab es an Java String. Das funktionierte einwandfrei, bis wir in der Zeichenfolge, die ich konvertieren wollte, "0" hatten. Dies verursachte einen Absturz.

Schließlich habe ich ein Byte-Array verwendet, um den Wert an den Server weiterzugeben. Das funktioniert perfekt.

jbyteArray jbArray = env->NewByteArray((int)call.len); 
env->SetByteArrayRegion(jbArray, 0, (int)call.len, (jbyte*)call.data); 
+0

Hallo, wie erhalten Sie jbyteArray in Java und konvertieren zu Zeichenfolge in Java. –

0

Ich sehe nicht, warum Ihr in dem zusätzlichen Gießschritt das Hinzufügen, Java-Strings sind Unicode, unsigned char * oder wchar_t * oder std::wstring().c_str() können mehr direkt verwendet werden.

unsigned char * ucptest=L"somestring"; 
jstring test1; 
std::string str(reinterpret_cast<const char*>(ucptest)); 
test1 = env->NewStringUTF(str.c_str()); 

jstring test2 = env->NewString(ucptest,wcslen(ucptest)); 
+0

Ich habe versucht "env-> NewString", aber ich sehe den folgenden Fehler Kompilierzeit Fehler. C2664: 'JNIEnv _ :: NewString': kann Parameter 1 von 'unsigned char *' nicht in 'const jchar *' umwandeln Typen, auf die verwiesen wird, sind nicht verwandt; Umwandlung erfordert reinterpret_cast, C-Stil-Cast oder Funktion-Stil-Cast – Vikas

0

Die std::string constructor Sie verwenden erwartet ein Null-c-string beendet. Der Konstruktor liest so lange, bis ein Nullzeichen gefunden wird. Dies kann zum Absturz führen. Sie sollten einen anderen Konstruktor verwenden, wenn Ihre Zeichenfolge nicht vollständig terminiert ist (std::string(char*,size_t)).

+0

nach dem Aufruf der Std :: String Ctor, ich bin Null am Ende der Zeichenfolge str [len] = null; wo len ist die Variable, die Anzahl der Gesamtwerte hat in 'unsigned char *' – Vikas

+0

@ user578742 wie hilft das die Zeichenfolge ctor? Ohne den Nul weiß der Ctor nicht, wo er aufhören soll zu lesen. – josefx

+0

ok, ich würde versuchen std::string(char*,size_t) Gibt es eine andere Möglichkeit, die Werte von 'unsigned char *' an Java Code übergeben? ohne zu tun Casting – Vikas

0

In Ihrem Fall Linie env->NewStringUTF(str.c_str()); muss im Bedingungsblock sein getStaticMethodInfo zur Überprüfung:

Code kann als gerahmt werden:

JniMethodInfo t; 

if (JniHelper::getStaticMethodInfo(t,<ANDROID CLASS PATH>,<METHOD NAME>,<PARAM TYPE>)) { 

    jstring jstr = t.env->NewStringUTF(<CONST CHAR* TYPE DATA>); 
    ...........CALL TO JAVA METHOD THROUGH JNI 
    t.env->DeleteLocalRef(t.classID); 

} 
Verwandte Themen