Java JNI-Exception externer JAR-Dateien

Technische Problemstellung:

Ihre MPS-basierte Applikation liefert ohne jegliche Probleme während des Build-Prozesses bzw. zur Compiletime eine wenig aussagekräftige Java JNI-Exception sofern Funktionalitäten externer JAR-Dateien ausgeführt werden?

Problemlösung:

Die Ursache für diese JNI-Exceptions könnte die Verwendung sogenannter Multi-Release JAR-Dateien sein. Hierbei handelt es sich um JAR-Archive, welche Class-Dateien unterschiedlicher Bytecode-Versionen beinhalten, welche also entweder mit unterschiedlichen Java-Compilern generiert wurden oder mit verschiedenen Java-Kompatibilitätseinstellungen. 

Um dies zu verifizieren, entpacken Sie das fragliche JAR-Archiv und überprüfen Sie die Version der Class-Dateien. Dies ist auf der Windows-Plattform mit Hilfe des folgenden Kommandos möglich:

javap.exe -v %PATH_TO_CLASS_FILE%/%CLASS_NAME%.class | findstr major

Sollten Sie hier unterschiedliche Major-Versionen der beinhalteten Class-Dateien sehen, so könnte dies eine Ursache für die JNI-Exception bei der Ausführung in MPS sein.

Versuchen Sie, die externe JAR-Datei direkt aus dem Quellcode, inclusiver aller abhängigen Bibliotheken selbst mit den korrekten Einstellungen zu compilieren, beispielsweise indem die Kommandozeilenparameter -source und -target auf den selben Wert gesetzt werden (bzw. -release, je nach Java-Version):

javac.exe -source 1.8 -target 1.8 %PATH_TO_JAVA_FILES%

Dies führt in diesem Beispiel dazu, dass sämtliche Class-Dateien mit Bytecode-Version 52 generiert werden. Sofern alle im JAR-Archiv beinhalteten Class-Dateien die selbe Major-Version aufweisen, ist erfahrungsgemäß auch eine Ausführung in MPS problemlos möglich.

Continuous Integration mit MPS und ANT