kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




JNI-Test

(EN google-translate)

(PL google-translate)

jni004.zip -- Ordner mit allen zum nachfolgenden Test gehörenden Dateien.
30_Informatik3/14_Zwischenprojekt/04_JNIumsetzen -- Später für das Erstellen einer Library muss die JNI in ein Package gebracht werden. Das wird hier beispielhaft gemacht.

Ziel ist es hier auf dem Jetson-Nano ein einfaches C-Beispiel als native Funktion von Java-Processing aus aufrufbar zu machen. Leider ist die dafür nötige javah-Methode in Java17 nicht mehr verfügbar, auf der die verwendete arm64-Processing-Version basiert. Darum wird zunächst zunächst zusätzlich auf dem Jetson java8 installiert:

sudo apt-get install openjdk-8-jre
sudo apt-get install openjdk-8-jdk

Code 0-1: Installation von java8 über das Terminal.

Ein Quelltext Call.java repräsentiert später die Java-Seite der nativen Funktion:

public class Call
{
    static 
    {
        System.load("/home/fhbstud/FUER_JETSON/PROJEKTE2022/JNI/jni004/mult.so");
    }
    public static native int mult(int a, int b);
}

Code 0-2: Call.java

javac Call.java

Code 0-3: Mit javac Call.java wird Call.class zunächst mittels Java8 erzeugt.

javah -jni -o ./mult.h Call

Code 0-4: Nun wird mittels javah die Haeder-Datei mult.h erzeugt.

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Call */

#ifndef _Included_Call
#define _Included_Call
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Call
 * Method:    mult
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_Call_mult
  (JNIEnv *, jclass, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

Code 0-5: Entstandene Datei mult.h

An mult.h läßt sich ablesen, wie man mult.c schreiben muß:

#include<jni.h>
#include "mult.h"
#include <stdlib.h>
#include <stdio.h>

JNIEXPORT jint JNICALL Java_Call_mult(JNIEnv *env, jclass clazz, jint a, jint b)
{
    return a*b;
}

Code 0-6: mult.c

gcc -o mult.so -shared -Wl,-soname,mult.so -I/usr/lib/jvm/java-8-openjdk-arm64/include/ -I/usr/lib/jvm/java-8-openjdk-arm64/include/linux/ mult.c -static -lc

Code 0-7: Nun wird die dynamische Bibliotheks-Datei mult.o erzeugt.

Jetzt kann noch Main.java erstellt und kompiliert werden, also das Hauptprogramm, dass Call verwendet:

public class Main
{
    public static void main(String[] args)
    {
        int y = Call.mult(4,5);
        System.out.println("4*5="+y);
    }
}

Code 0-8: Main.java

javac Main.java
java Main

Code 0-9: Kompilieren und Testen von Main im Terminal mit java8


Obwohl bisher alles mit Java8 erstellt wurde, ist die dynamische Bibliothek auch verwendbar, nachdem Call.java und Main.java nachträglich mit Java17 kompiliert wurden.


/home/fhbstud/processing-4.0b6-linux-arm64/processing-4.0b6/java/bin/javac Call.java
/home/fhbstud/processing-4.0b6-linux-arm64/processing-4.0b6/java/bin/javac Main.java 
/home/fhbstud/processing-4.0b6-linux-arm64/processing-4.0b6/java/bin/java Main 

Code 0-10: Nachträgliches Kompilieren von Call.java und Main.java mit dem zu Processing gehörenden Kompiler der Version java17.

...dies soll als Test dienen, um einzuschätzen, ob eine später für Processing erstellte Library für native Funktionen so erstellt werden kann, dass sie auch mit der verfügbaren arm64-Processing Version mit integriertem java17 funktioniert.