Hallo ich habe ein Problem. Ich möchte nun aus Lua ein Java Code einbinden. Geht das?

2 Antworten

Willst also von Lua Java Code ausführen (oder andersherum?) Mit Lua Javacode ausführen sollte einfacher sein als umgekehrt - schon allein weil Java Typenprüfung hat. Musst in der Richtung auf Java-Seite eigentlich gar nichts beachten.

Ich würde sagen, die sinnvollste Art das zu realisieren, wäre so etwas zu nutzen:

http://www.luaj.org/luaj/3.0/README.html

Also einen Lua-Interpreter in der JVM laufen zu lassen. Wahrscheinlich könntest du auch versuchen den Java-Code mit gcj zu kompilieren Lua - hat ja gute C++ Anbindung - aber das ist wahrscheinlich nicht so einfach...

Ich verweiße mal auf diese Hilfe-Seite:

http://www.luaj.org/luaj/3.0/README.html#2

Da hast du alles erklärt inklusive Beispiele.

Gruß

Tuxgamer


Danke erstmal. Ja genau... Ich will dem Pi über ein bestimmtes system - egal - ein Argument übergeben. Das ist im Lua skript hinterlegt, das die Argumente abgleicht. Und nun soll das Lua skript bei dem bestimmten Argument praktisch nur weiterleiten in ein anderes Skript, in dem steht dann was der Raspi macht. und diese ist eben in java. Nachdem das java ding abgearbeitet ist kann er zurückkehren und auf ein neues Argument für das Lua Ding warten. Gibt es da nicht irgendeine schnelle und leichte variante ?

0
@derLukinator

Ach so - sag doch gleich. Willst also das ganze nicht in einem Prozess, sondern einen Prozess aufmachen.

http://www.lua.org/manual/5.1/manual.html#pdf-os.execute

also einfach os.execute("java -jar PFAD_ZU_JAR PARAMETER")

Als Rückgabe bekommst du Exit-Code - also 0 wenn alles geklappt hat und irgendetwas anderes wenn eben nicht.

Die PARAMETER landen im String[] args von der Java-Main-Methode.

Wenn du Ausgabe brauchst:

http://www.lua.org/manual/5.1/manual.html#pdf-io.popen


1
@tuxgamer

Achso also der typische execute... vielen dank :) muss das Java Zeug compiliert sein das es läuft... also .class?

0
@derLukinator

Yep; .class. Als Source-Code (.java) - nie.

Mir ist auch keine Implementierung von irgendeinem java-Interpreter oder so bekannt. Java 9 wird dann auch wie Lua oder Python interactive Shell haben - vielleicht dann.

Also: Ja, übersetzen.

Entweder alles als Jar zusammenpacken; reine .class funktionieren aber genauso (dann eben nur das -jar beim Ausführen weglassen).

Ach ja: Achte darauf, dass Java im richtigen Ordner ausgeführt wird! Da ist sonst Java ein bisschen komisch. Am einfachsten wahrscheinlich mit -cp und danach den Ordner, wo das ganze Zeug drinnen liegt. Also:

java -cp EXEC_FOLDER MAIN_CLASS PARAMETER
1
@tuxgamer

Ich habe mal ein Test gemacht. Das Programm:
public class HelloWorld {
    public static void main (String[] args) {
         System.out.println("HelloWorld");
    }
}
und dass compiliert... liegt also als HelloWorld.class vor.

Nun hab ich im luaskript folgenes stehen:
elseif (string.lower(msg.text) == 'Java') then
     local handle = io.popen("sudo python /home/pi
     /tg/HelloWorld.java")
     local res = handle:read("*a")
     handle:close()
     os.execute("/home/pi/tg/send_script ".. msg.from.print_name .." '"..res.."' ")
return

Wenn ich an den Pi nun Java schicken soll eigentlich das Java Ding ausgeführt werden also "HelloWorld" ausgegeben werden. Leider klappt es nicht. Ich habe leider sowas von keine Ahnung wieso das nicht klappt, ich hoffe du weißt eine Lösung :) Hab ich einen falschen Parameter benutzt?

>>> Java
*** .... lua: attempt to call a nil value
ist die AUsgabe

0
@derLukinator

"sudo python /home/pi/tg/HelloWorld.java"

okay:

1. bitte ohne sudo. Willst das nicht mit erhöhnten Rechten ausführen.

2. Wenns Java-datei ist, würde ich java schreiben - nicht python :).

3. Musst auch die .class Datei angeben (wobei man die Endung bei Java weglassen kann).

Sollte also so aussehen:

   local handle = io.popen("java -cp /home/pi/tg/ HelloWorld")
1
@tuxgamer

oh ja klar das python ist dort völliger Mist :D Danke aber es gibt immernoch nicht "HelloWorld" aus obwohl es das soll sondern nur den Kommentar:
*** lua: attempt to call a nil value

Das ist aber der Code (wie du verbessert hast):
elseif (string.lower(msg.text) == 'Java') then
local handle = io.popen("java -cp /home/pi/tg/HelloWorld.java")
local res = handle:read("*a")
handle:close()
os.execute("/home/pi/tg/send_script ".. msg.from.print_name .." '"..res.."' ")
return

Ich weiß echt nicht warum :(

0
@derLukinator

Sagt doch bestimmt mehr, als nur attempt to call a nil value. Sollte wenigstens Zeile oder so sagen.

Oder führst du es über den Live Interpreter aus?

In dem Fall ist das local problematisch - wenn du nämlich im Interkativen Interpreter Enter drückst, endet der momentane "chunk" - und die local-Variable ist nicht mehr sichtbar.

0
@tuxgamer

Hey ich habe dir den Code nochmal privat geschickt und schicke dir gleich nochmal die genaue Ausgabe

0

Das ist die ganue Ausgabe die ich bekomme. Ping-Pong ist der Test - der läuft aber komplett im lua... aber das was ins Java greift geht nicht - kommt nichts zurück wie man sieht

 - (Technik, programmieren, Java)

Wie hast du denn das geschafft, das lua dir keine vernünftigen Fehlermeldungen ausspuckt?

zugegeben: So viel lua habe ich auch noch nicht programmiert. Aber das kann eigentlich nicht sein, dass Lua nur solche unsagenden Fehlermeldungen ausspuckt.

Fängst du z.B. irgendwo sämtliche Fehler ab und gibst dann selber irgendeine Meldung zurück?

Jedenfalls:

Von dem Code, den du mir geschickt hast, kommt Fehler in dieser Zeile:

os.execute("/home/pi/tg/send_script ".. msg.from.print_name .." '"..res.."' ")

Fragt sich natürlich, was msg ist. Und wo es deklariert ist.

0

Wie kann ich mehrere Klassen in Java, Bukkit einbinden?

Ich schreibe derzeit ein System. Da ich noch anfänger bin, muss ich hier mal Fragen. Also ich habe ein Package die ist die Main class. Wenn ich den Server Starte soll die sagen, ok ich in an und schreiben "Aktiv" und wenn er runterfährt halt "Inaktiv". Nun meine Frage: Kann ich, wenn das Main-Package indem die Start.Java ist mit den Anderen z. B. Regel-Java in dem Regel-Package einbinden, sodass das Package auch gestartet wird? Kann mir einer von euch Experten oder die die sich damit auskennen, sowas vorschreiben?

...zur Frage

Wie kann ich mit Java Text in eine bereits existierende Datei schreiben?

...zur Frage

kann man PI mit Java berechnen?

ich würde gerne mit Java Pi ausrechnen lassen, aber kenne keinen Code dafür.

könnte mir jemand sagen ob es ein Programm gibt oder einen Code für die Programmierung von Pi (Javacode) als antwort schreiben

Danke schon mal im Vorraus

...zur Frage

Wie kann ich Java auf Deutsch umstellen?

Hallo, ich wollte mit Java programmieren anfange, habe dann aber schnell gemerkt, dass die Befehle so eigenartig englisch waren.

Deswegen wollte ich wissen, wie man es einstellen kann, dass man in deutschem code schreiben kann.

...zur Frage

Wie kann man eine Webseite in einem Java Fenster öffnen?

Ich möchte eine Webseite in ein Java Programm einbinden. Ich hab bereits zum experementieren begonnen, aber das wird nichts. Ich hab zu dem Thema schon was erggooglet doch da finde ich nur etwas für Windows Rechner. Ich möchte das Programm aber auf einem Mac ausführen.

Lg :)

...zur Frage

WAV-Datei in Java-Programm einbinden?

Hallo

Ich Programmiere gerade mein eigenes Spiel und möchte eine dazu passende Musik einbinden. Leider suche ich jetzt schon sehr lange und finde keine Lösung... Jeder Code den ich ausprobiere funktioniert nicht. Könnt ihr mir vielleicht helfen, einen Code zu finden, der wav Dateien im Hintergrund abspielen lässt?

Danke

...zur Frage

Was möchtest Du wissen?