Sonntag, Dezember 15, 2019

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.
InformationsquelleAutor Aqura | 2011-01-17

4 Kommentare

  1. 3

    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 Java String. 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.

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

    Sehe ich nicht, warum Ihr das hinzufügen der zusätzlichen casting-Schritt -, java-strings sind unicode unsigned char * oder wchar_t * oder std::wstring().c_str() verwendet werden können, mehr direkt.

    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));
    • Ich habe versucht, „env->NewString“ aber ich sehe die folgenden compile-Zeit-Fehler-Fehler. C2664: ‚JNIEnv_::NewString‘ : cannot convert parameter 1 from ‚unsigned char *‘ in ‚const jchar *‘ Arten wies auf nichts; die Konvertierung erfordert reinterpret_cast, C-style-cast-oder function-style-cast
  3. 0

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

    • nach dem Aufruf von std::string ctor, ich bin durch das zuweisen von null am Ende der Zeichenfolge str[len] = null; wo len ist die variable, die die Anzahl der Werte in ‚unsigned char*‘
    • wie sieht die Hilfe der string-ctor? Ohne die nul dem ctor nicht weiß, wo Sie aufhören zu Lesen.
    • ok, ich würde versuchen, heraus <code> std::string(char*,size_t) </code> gibt es eine andere Möglichkeit zu passieren, die Werte von ‚unsigned char *‘ in java-code? ohne casting
  4. 0

    In deinem Fall Zeile env->NewStringUTF(str.c_str()); muss sich im bedingten block für die überprüfung getStaticMethodInfo:

    code kann gestaltet werden als:

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

Kostenlose Online-Tests

Letzte Fragen

Tun ItemView löst Blase?

Ich habe eine CompositeView für eine Tabelle. Ich habe Trigger-set in der Kind-ItemView für jede Zeile... var TableRow = Marionette.ItemView.extend({ tagName:...

Wie kann ich untersuchen, WCF was 400 bad request über GET?

Die folgenden WCF-endpoint funktioniert gut mit dem WCF test client: AssetList ListFlaggedAssets(short processCode, string platform, string endpoint = "null", string portalId = "null", int...

Bei der Verwendung von UUIDs, sollte ich auch mit AUTO_INCREMENT?

Wir bauen eine neue web-app, die eine offline-iPad - /Android-app-version auf einer Reihe von lokalen Geräten, die Einsätze mit neuen Daten. Als solche benötigen...

Actionscript-Objekt, das verschiedene Eigenschaften

Wie kann ich die Anzahl der Eigenschaften in einer generischen Actionscript-Objekt? (Wie die Array-Länge) InformationsquelleAutor Fragsworth | 2011-01-15

Wie plot mehrere Graphen und nutzen Sie die Navigations-Taste im [matplotlib]

Die neueste version von matplotlib erstellt automatisch Navigations-buttons unter den graph. Aber die Beispiele, die ich finden alles im Internet zeigen, wie erstellen Sie...