Die folgenden Abschnitte erläutern das Vorgehen beim Erzeugen eines Shared Objects mit native Methoden, die später dynamisch durch die Java-VM geladen werden können.
Compilieren der Sources
Zum Compilieren der C-Sources von Java-Native-Methoden muss der Compiler C/C++ ab V3.0B für die mit JNI arbeitenden Source-Teile eingesetzt werden.
Bei der Compilierung von C- oder C++-Teilen sind unbedingt die folgenden Compiler-Optionen zu benutzen:
-I <Installations-Pfad>/include
Diese Option ist notwendig, damit die Header-Dateien der Java-Distribution gefunden werden. Dabei ist für <Installations-Pfad> der Pfad zu substituieren, wo JENV installiert wurde. Für eine Standard-Installation ist dies /opt/java/jdk-11.0.6. Die aktuell gültige Bezeichnung ist der Freigabemitteilung zu entnehmen.
-K workspace_stack
Dies ist notwendig, damit der Garbage Collector auch die in den C-Teilen verwendeten Java-Objekte finden kann und die Objekte threadfest sein können.
-K c_names_unlimited
Dies ist notwendig, damit das Name-Mangling für Native-Interface-Funktionen korrekt funktioniert.
-K llm_keep
Dies ist notwendig, damit das Name-Mangling für Native-Interface-Funktionen korrekt funktioniert und die Runtimesystem-Funktionen gefunden werden.
-K llm_case_lower
Dies ist notwendig, damit das Name-Mangling für Native-Interface-Funktionen korrekt funktioniert und die Runtimesystem-Funktionen gefunden werden.
-D __SNI_THREAD_SUPPORT
Diese Option muss bei C++-Übersetzungen unbedingt angegeben werden.
Die folgenden Compiler-Optionen können sinnvoll sein:
-K ieee_floats
Wenn das IEEE-Format für Gleitkomma-Zahlen auch im C-Code verwendet werden soll.
-K literal_encoding_ascii
-K literal_encoding_ascii_full
Wenn im C-Code mit ASCII-Strings gearbeitet werden soll.
-K enum_long
Sollte immer gesetzt sein, da die Standard-Einstellung nicht dem ANSI-Standard entspricht.
Außerdem muss unbedingt im ANSI-Modus (-Xa oder -Xc) übersetzt werden.
Binden eines Großmoduls
Sollte die Implementierung eines Shared Objects aus mehreren Modulen bestehen, so sollten diese zu einem Großmodul zusammengebunden werden. Das geschieht mit dem Kommando cc oder c89, wobei mindestens folgende Option angegeben sein muss.
-r
Diese Option bewirkt das Binden eines Großmoduls ohne Hinzunahme von Standard-Bibliotheken wie CRTE. Diese dürfen auch keinesfalls explizit mit -lc oder -socket dazugebunden werden.
-B llm4
Diese Option veranlasst den Binder, einen Großmodul im LLM4-Format zu erzeugen, was für die langen Namen der Java-Native-Methoden notwendig ist.
Erzeugen einer LMS-Bibliothek
Der erzeugte (und im POSIX-Dateisystem vorliegende) Großmodul muss in einer PLAM-Bibliothek als Element mit dem Elementtyp L abgelegt werden. Dies geschieht am besten mit dem POSIX-Kommando bs2cp, das die Bibliothek auch neu erzeugt, falls sie noch nicht existiert.
In einer solchen PLAM-Bibliothek können durchaus mehrere Shared Objects abgelegt werden.
Der Element-Name des Moduls in der Bibliothek darf maximal 32 Zeichen lang sein.
Erzeugen der Object-Beschreibung
Für die Erzeugung der notwendigen Beschreibungsdatei für ein Shared Object steht das Kommando mk_shobj zur Verfügung. Zur Ansicht des Inhalts einer solchen Beschreibungsdatei dient das Kommando pr_shobj. Beide Kommandos sind Bestandteil der Java-Distribution und detailliert im Kapitel „Kommandos für BS2000" beschrieben.
C++-Objekte müssen als solche gekennzeichnet werden (siehe Abschnitt „Optionen" im Abschnitt "mk_shobj").