Übergeben eines Bytes[] in Java zu einer Funktion in C durch JNI: wie man jarraybyte verwendet

Lesezeit: 3 Minuten

Dies ist das erste Mal, dass ich das JNI verwende und auch das erste Mal, dass ich einige Zeilen in C schreiben muss.

Was ich versuche, ist sehr einfach. Ich versuche nur, die Endiannes eines Bytes zu wechseln[] mit einer C-Routine.

In Java geht das so:

public void switchEndianness(byte[] array){

        byte byte1;
        byte byte2;

        for(int i = 0; i < array.length ; i+=2){
            byte1 = array[i];
            byte2 = array[i+1];

            array[i] = byte2;
            array[i+1] = byte1;
        }
}

Um dies mit JNI zu tun, habe ich versucht, dieselbe Routine in JNICALL zu implementieren, aber sie wird nicht kompiliert. Was ich bisher geschrieben habe ist folgendes:

JNIEXPORT void JNICALL Java_CEndianness_switchEndianness(JNIEnv *env, jobject obj, jbyteArray array, jint offset, jint length){

    char byte1;
    char byte2;

    int i;
    for(i = offset; i  < length ; i+=2){
        byte1 = array[i];
        byte2 = array[i+1];

        array[i] = byte2;
        array[i+1] = byte1;
    }
}

Ich habe keine Ahnung, wie man den Datentyp jbyteArray verwendet. ist es möglich, ein jbyte in einem char zu speichern??? Eine andere Frage ist … wenn diese Routine vorbei ist … wird das Byte[] in Java geändert werden? Oder wird es nur innerhalb des C-Aufrufs geändert?

Irgendeine Hilfe???

Danke an Alle!

Sie können jbyte* von GetByteArrayElements erhalten:

jbyte* bufferPtr = (*env)->GetByteArrayElements(env, array, NULL);

Und es ist wichtig, die Länge Ihres Arrays zu kennen:

jsize lengthOfArray = (*env)->GetArrayLength(env, array);

Mit jbyte* und Länge können Sie alle Dinge in c-Array tun. Endlich freigeben:

(*env)->ReleaseByteArrayElements(env, array, bufferPtr, 0);

  • Beachten Sie, dass die Verwendung nach Möglichkeit empfohlen wird (*env)->ReleaseByteArrayElements(env, array, bufferPtr, JNI_ABORT);. Der letzte Parameter bedeutet, dass die JVM nicht versucht, die Bytes von bufferPtr zurück in das Java-Array zu kopieren. Sehr oft wissen Sie, dass die C-Funktion das Array nicht ändert.

    – Alex Cohn

    23. November 2013 um 8:43 Uhr

  • Wenn Sie C++ anstelle von C verwenden, ist die Syntax etwas anders. Sie müssen env nicht dereferenzieren und Sie müssen es nicht als Parameter übergeben. Beispiel: bufferPtr = env->GetByteArrayElements(array, NULL).

    – Johann Henckel

    17. März 2014 um 14:06 Uhr

Benutzeravatar von Jason LeBrun
Jason LeBrun

qrtt hat Ihnen eine großartige Antwort gegeben.

Das JNI verfügt jedoch über eine sehr umfassende und (relativ) leicht verständliche Dokumentation, die Sie von vorne nach hinten lesen sollten, wenn Sie in Zukunft wieder JNI-Funktionen verwenden. Sie finden es hier:
http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html

Für Ihren speziellen Fall finden Sie hier den Abschnitt zum Umgang mit Arrays:
http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/design.html#wp1265

  • die url ist geändert. 🙂 docs.oracle.com/javase/1.4.2/docs/guide/jni/spec/jniTOC.html

    – qrtt1

    10. März 2013 um 2:42 Uhr

  • die url wird wieder geändert: docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/…

    – Chris

    8. Januar 2014 um 15:28 Uhr

  • Als ich JNI lernte, las ich die Dokumentation von vorne nach hinten. Es war ziemlich hilfreich.

    – Jason LeBrun

    19. Februar 2015 um 23:19 Uhr

  • Richtig, aber der Zweck von StackOverflow ist nicht, Leute auf die Dokumentation hinzuweisen. Der Zweck besteht darin, Antworten zu geben und Links zur Dokumentation als Referenz einzufügen.

    – Kristjan

    17. März 2017 um 10:05 Uhr

  • Wenn Sie nicht bereit sind, die Dokumentation von vorne bis hinten zu lesen, bereiten Sie sich auf viele Enttäuschungen bei der Verwendung des JNI vor.

    – Benutzer1725145

    9. Juli 2019 um 15:27 Uhr


1387580cookie-checkÜbergeben eines Bytes[] in Java zu einer Funktion in C durch JNI: wie man jarraybyte verwendet

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy