Berühren wir Web Assembly, das in letzter Zeit immer besser wird. Ich möchte eine Umgebung erstellen, in der Java als Betreff ausgeführt werden kann. Ja, es ist ein Java-Interpreter (Java VM), der in einem Browser wie einem Java-Applet ausgeführt wird.
Zunächst möchte ich ablehnen. Obwohl es sich um einen Java-Interpreter handelt, der Java-Bytecode interpretiert, implementiert er minimalen Bytecode. Da es nur wenige Klassen unter Java / Lang implementiert, ist es praktisch nutzlos. Persönlich habe ich es für das Studium von Java-Interpreter gemacht. Es tut mir leid für diejenigen, die erwartet haben.
Wir werden wie folgt vorgehen.
Ich habe "waba" als den C-Sprach-Quellcode des Java-Interpreters bezeichnet. Ich habe viel gelernt. Vielen Dank.
wabasoft http://wabasoft.com/
Ich habe "emscripten" für den WebAssembly-Compiler verwendet. https://emscripten.org/index.html
Das Folgende ist die Fortsetzung. Ausführen von Java VM mit Web Assembly: Ergänzung
Ich habe es in der WSL-Umgebung von Windows 10 installiert. Also benutze ich Python 2.7, aber es wurde bereits installiert.
> python --version
Python 2.7.15rc1
> git clone https://github.com/juj/emsdk.git
> cd emsdk
> ./emsdk install latest
> ./emsdk activate latest
Sie haben jetzt den WebAssembly-Compiler "emcc" installiert. Wenn Sie es verwenden, müssen Sie es durchlaufen, gehen Sie also wie folgt vor:
> source ./emsdk_env.sh --build=Release
Erstellen Sie einen geeigneten Ordner und arbeiten Sie.
Legen Sie eine Reihe von Quelldateien in C-Sprache in denselben Ordner.
Ich habe es auf dem folgenden GitHub gepostet.
https://github.com/poruruba/javaemu
> git clone https://github.com/poruruba/javaemu.git
> cd javaemu
Kompilieren Sie den Java-Quellcode. Der Java-Quellcode wird in zwei Typen unterteilt und die Platzierungsmethode wird geändert. Die erste ist eine Java-Quelle, die in WebAssembly eingebettet ist, und die andere ist eine Java-Quelle, die nicht in WebAssembly eingebettet ist. Letzteres ist normaler, vom Benutzer geschriebener Java-Quellcode. Auf der anderen Seite werden Java / Lang usw. von normalen Benutzern verwendet, und die Java-Quelle des Systems, die sich nicht ändert, ist die erstere. Ersteres ist auch eine Java-Klasse mit nativen Funktionen, die nur in C-Sprache verarbeitet werden können und mit Interpreten funktionieren.
Es wird davon ausgegangen, dass der Quellcode im Ordner java_src erstellt wird. Erstellen Sie einen Ordner, um die kompilierten Klassendateien abzulegen. Sagen wir pre_classes.
> mkdir pre_classes
Die Zusammenstellung ist wie folgt.
>javac -encoding UTF8 -d pre_classes -sourcepath java_src java_src/base/framework/*.java java_src/java/lang/*.java java_src/test/*.java
Die Java-Quelldateien unter base / framework und java / lang sind die Java-Quellen für das System. java_src / test / *. java wird später zum Testen verwendet. Entfernen Sie es daher nach dem Testen. Jetzt haben Sie eine Java-Klassendatei im Ordner pre_classes.
Ich habe das Oracle JDK unter Windows verwendet. Im Fall von OpenJDK habe ich es mit der Klassendatei in der Ausführungsumgebung bekämpft und wusste nicht, wie ich es ausschließen sollte. .. ..
Lassen Sie uns kompilieren
> emcc *.c -s WASM=1 -o javaemu.js -s "EXTRA_EXPORTED_RUNTIME_METHODS=['ccall', 'UTF8ArrayToString', 'stringToUTF8Array']" --preload-file pre_classes
(Referenz) Optionen zur Kompilierungszeit https://emscripten.org/docs/tools_reference/emcc.html#emccdoc
-s WASM = 1 ist ein Zauber, der angibt, dass eine WASM-Datei generiert wird.
-o javaemu.js dient zum Generieren einer Datei (javaemu.data), die eine WASM-Datei (javaemu.wasm), ein Dienstprogramm Javascript (javaemu.js) und eine in WebAssembly einzubettende Java-Klassendatei kombiniert. Der Name Javaemu ist angemessen. Bitte verwenden Sie einen beliebigen Namen.
-s EXTRA_EXPORTED_RUNTIME_METHODS ist der Name der von javaemu.js bereitgestellten Funktion, die aus Javascript der im Web platzierten HTML-Seite aufgerufen werden darf. ccall ist erforderlich, aber die anderen beiden sind nützlich, also setze ich sie.
--preload-file gibt den Namen des Ordners an, in dem sich die in WebAssembly einzubettenden Dateien befinden. Die Dateien unter dem angegebenen Ordnernamen werden in einer Datei namens javaemu.data gruppiert.
Von den fertigen Dateien sind diejenigen, die im Web abgelegt werden sollen, "javaemu.wasm", "javaemu.js" und "javaemu.data". javaemu.wasm ist nur eine WebAssembly-Datei, die die C-Sprache kompiliert.
Von Javascript auf Webseiten aufgerufene Funktionen sind in main.c. definiert.
main.c
int EMSCRIPTEN_KEEPALIVE setInoutBuffer(const unsigned char *buffer, long bufferSize );
int EMSCRIPTEN_KEEPALIVE setRomImage(unsigned char *romImage, long romSize );
int EMSCRIPTEN_KEEPALIVE callStaticMain(char *className, char *param );
Laden Sie das HTML der von GitHub abgelegten Dateien auf den Webserver hoch. Wir haben auch eine Seite zur Überprüfung des Vorgangs vorbereitet. Platzieren Sie die drei gerade generierten Dateien ebenfalls im HTML-Ordner.
> cp javaemu.wasm javaemu.js javaemu.data html/
Oder
> cd html
> ln -s ../javaemu.wasm ../javaemu.js ../javaemu.data .
> cd ..
(Bitte legen Sie es im Stammordner von HTML ab, da sonst javaemu.js Wasm- und Datendateien nicht gut liest.)
Zum Glück hat emscripten eine einfache Webserver-Funktion, also werde ich diese verwenden. Die Portnummer lautet 8080.
emrun --serve_root html --no_browser --port 8080 .
Lassen Sie uns jetzt über den Browser darauf zugreifen. Als Browser habe ich versucht, es unter Chrome unter Windows auszuführen.
http://localhost:8080
Aus Gründen der Übersichtlichkeit drücke ich F12, um die Entwicklerkonsole aufzurufen.
Geben Sie den Namen der eingebetteten Java-Klasse zum Testen des Klassennamens ein. Es ist "test / TestFunc".
Der ursprüngliche Quellcode sieht wie folgt aus.
TestFunc.java
package test;
import base.framework.System;
import base.framework.Convert;
import base.framework.Util;
public class TestFunc{
public static void main( String[] args ){
try
{
System.println("Hello test/TestFunc");
if( args.length >= 1 )
System.println("args[0]=" + args[0]);
String[] input = System.getInput(-1);
for( int i = 0 ; i < input.length ; i++ )
System.println("params[" + i + "]=" + input[i]);
System.setOutput(new String[]{ "World", "Guten Abend" });
}catch( Exception ex )
{
System.print( ex.toString() );
ex.printStackTrace();
}
}
}
Geben Sie eine entsprechende Zeichenfolge in Input Arg und Input Params ein. Drücken Sie sofort die Taste "Start war m".
Rufen Sie die in C-Sprache implementierte Funktion mit dem folgenden Gefühl auf. Das Laden und Ausführen der WebAssembly-Datei erfordert viel Arbeit, aber javaemu.js macht es gut.
start.js
this.output_return = Module.ccall('callStaticMain', // name of C function
"number", // return type
["string", "string"], // argument types
[this.class_name, this.input_arg]); // arguments
Während dann die chaotischen Debug-Zeichen in der Konsole des Browsers angezeigt wurden, wurde meiner Meinung nach die folgende Zeichenfolge angezeigt. Die Ausführung der Java-Klassendatei durch den Java-Interpreter ist abgeschlossen.
Hello test/TestFunc args[0]=ABCD params [] = Aiueo params [1] = Kakikukeko
Außerdem sollte auf der Seite Folgendes angezeigt werden.
Output Return 0 Ausgabeparameter ["Welt", "Guten Abend"]
Lassen Sie uns nun verschiedene Java-Quellen erstellen und ausführen.
Ich werde es unter java_src erstellen. Dieses Mal erstellen wir es im Ordner test2.
Die Zusammenstellung ist wie folgt.
> mkdir classes
> javac -encoding UTF8 -d classes -sourcepath java_src -classpath pre_classes java_src/test2/*.java
Ich erstelle einen Ordner Klassen zum Speichern von Klassendateien. Da angenommen wird, dass pre_classes in die WebAssembly-Datei eingebettet ist, wird davon ausgegangen, dass es sich um eine vorhandene Klassendatei handelt, die kompiliert wurde.
Machen Sie als Nächstes die erstellte Klassendatei zu einer Jar-Datei.
> jar cvf classes.jar -C classes .
Die Dateien unter dem Klassenordner sind jetzt in der Datei classes.jar gruppiert. Andere Dateien als die Test2-Klassendatei wurden ebenfalls erstellt, sind jedoch harmlos und können ignoriert oder vom Jar-Dateiziel ausgeschlossen werden.
Klicken Sie auf die Schaltfläche "Datei auswählen" und geben Sie die zuvor erstellte "classes.jar" an. Darunter wird eine Liste der in der Jar-Datei enthaltenen Klassendateien angezeigt.
Ich habe unzip.min.js von zlib.js verwendet, um die Jar-Datei, dh die ZIP-Datei, zu extrahieren.
zlib.js https://github.com/imaya/zlib.js
Führen Sie es jetzt erneut über den Browser aus.
Geben Sie als Klassennamen dieses Mal test2 / TestFunc an, das in der Jar-Datei enthalten ist, und klicken Sie zum Ausführen auf die Schaltfläche "Start war m".
Haben Sie Folgendes auf der Konsole gesehen? Es wird test2 / TestFunc und Sie können sehen, dass die entsprechende Quelle ausgeführt wird.
Hello test2/TestFunc args[0]=ABCD [] = Aiueo [1] = Kakikukeko
Der Java-Interpreter wurde stark von waba angepasst und ist voller Fehler, daher möchte ich dies ablehnen. .. ..
Die Erklärung wird im nächsten Artikel sein. Zuerst bis hierher.
Das Folgende ist die Fortsetzung. Ausführen von Java VM mit Web Assembly: Ergänzung
das ist alles.
Recommended Posts