jint nach int*



  • Hallo zusammen,

    das ist mein erster Post hier und ich weiss nicht so genau ob ich hier damit richtig bin.

    Ich habe folgende Frage, wie kann ich einen jint in ein int* umwandeln?

    Also bei einem jstring (nach char*) geht das ja folgendermassen:

    char* testChar= (char*) (*env)->GetStringUTFChars(env, test, 0);

    Gibt es da auch was ähnliches für einen jint? Ich muss den Wert anschliessend einer Methode übergeben, und wenn ich das ohne Umwandlung mache funktioniert es leider nicht.

    Wäre nett wenn mir jemand so schnell wie möglich weiterhelfen könnte.



  • jint ist kein C Datentyp.
    Java ist nicht C.
    Meines Wissens kennt Java keine Pointer.
    int * ist ein Pointer auch eine Variable vom Typ int.
    Beides mixen geht nicht. Es sei den Du kannst in Java C-Libs nutzen.

    Die Frage (welche eigentlich?) wirkt auf mich ziemlich konfus. 😕



  • jint ist ein Typ aus dem JNI (Java Native Interface), und das ist dazu gedacht, C an Java anzubinden. jint ist das selbe wie int32_t, was auf vielen Plattformen (aber nicht allen) das selbe wie int ist. Um auf Nummer sicher zu gehen, wirst du eine Kopie anlegen müssen.

    Geht es um einen einzelnen int oder um ein Integer-Array? Das geht aus deiner Beschreibung nicht ganz hervor.



  • Also ich muss in meinem Java Code eine Methode aus einer dll aufrufen. Diese ist in c geschrieben (nicht von mir). Ich binde die dll nun über JNI an meinen Java Code an.

    Meine JNI Methode sieht so aus

    JNIEXPORT jint JNICALL Java_recognition_RecognitionLowLevelFacade_XImgValFieldGet(
    		JNIEnv * env, jobject obj, jshort docType, jstring codingLine21, jstring codingLine23, jstring fieldName, jstring fieldValue, jint status)
    

    Die jstrings wandle ich folgendermassen um und übergebe dann die neue Variable der Methode:

    char* codingLine21Char = (char*) (*env)->GetStringUTFChars(env,
    			codingLine21, &b);
    

    Die Methode in der dll sieht dann folgendermassen aus:

    int XImgValFieldGet(WORD   wDocType,
    					LPSTR  lpszKZ21,
    					LPSTR  lpszKZ23,
    					LPSTR  lpszFieldName,
    					LPSTR  lpszFieldValue,
    					LPINT  lpnStatus)
    

    Bis auf den LPINT lpnStatus kann ich die Variablen ohne Probleme übergeben. Beim Debuggen haben Sie auch einen Wert, im Gegensatz zum Status. Dort steht "CXX0030: Error: expression cannot be evaluated"

    Der Datentyp wird mir beim Debuggen als int* angezeigt. Sobald in der Methode in der dll der Variable lpnStatus ein neuer Wert übergeben werden soll oder allgemein darauf zugegriffen wird, bricht das Programm ab. Daher vermute ich, dass ich von Anfang an einen falschen Wert oder Datentyp übergebe. Es ist ziemlich kompliziert zum erklären, aber ich hoffe das mein Problem jetzt etwas klarer ist.



  • Das wird ein zweiter Rückgabewert sein - call-by-reference auf C-Art halt. Im C-Code sieht der Aufruf nachher so aus:

    WORD doctype;
    char *bar, *baz, *qux, *quux;
    int status, r;
    
    /* Kram initialisieren */
    
    r = XImgValFieldGet(doctype,
                        bar,
                        baz,
                        qux,
                        quux,
                       &status); // <-- Adresse von status
    

    XImgValFieldGet schreibt dann etwas in status hinein.

    Auf der C-Seite wird das nicht weiter problematisch sein - kopier den jint in einen int und gib dessen Adresse an die Funktion. Das Problem ist, den Kram nachher nach Java zurückzukriegen, weil Java diese Art des Call-By-Reference nicht unterstützt. Wie die Java-Schnittstelle letztendlich aussehen soll, musst du dir aber selbst überlegen -- ich hege bei so was immer die Vermutung, dass einer der beiden Rückgabewerte ein Fehlercode ist, der in Java am besten auf eine Exception gemappt werden sollte.



  • Ach so geht das! Vielen Dank.. C ist überhaupt nicht meine Stärke, ich bin eher der Java Anhänger 🙂 Funktioniert jetzt auf jeden Fall!


Anmelden zum Antworten