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

Minecraft Computecraft Bundled Cable toggle. Brauche hilfe dabei!?

Ich wollte durch einen Bundle nur den Roten Kabel (Red Cable) Umschalten aber es funkt nicht wie ich es erhoft habe Bin neu bei Computercraft und zu thema Lua

right = rs.getBundledInput("right",colors.red)
if right == false then
rs.setBundledOutput("right",colors.combine(rs.getBundledInput("right"),colors.red))
else
rs.setBundledOutput("right",colors.subtract(rs.getBundledInput("right"),colors.red))
end

Habe auch noch eine zweite variante versucht aber klappt auch nicht

function toggleColor(side, col)
 if colors.test(rs.getBundledInput(side), col) == true then
  rs.setBundledOutput(side, colors.subtract(col, rs.getBundledInput(side)))
 else
  rs.getBundled.Output(side,colors.combine(col, rs.getBundledInput(side)))
 end
end

toggleColor("right", colors.red)
...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

Retropie mit 2 Spielern also 2 joysticks und je 8 druckknöpfe?

Ich möchte mit einem Freund lokal an einem Raspberry Pi spielen (Retropie), jedoch habe ich Probleme, dass der Raspberry Pi beide Joysticks erkennt. Einzeln funktionieren sie, aber wenn beide angeschlossen sind denkt der Raspberry Pi, dass es nur 1 Joystick gibt, das heißt, es geht nur der eine. Ich bräuchte einen Vorschlag wie ich einstelle, dass der Raspberry Pi weiß, dass es 2 verschiedene Joysticks sind. Die Joysticks und Taster/Knöpfe sind über eine encoder Tafel angeschlossen also über USB. Habe dieses Set: https://www.amazon.de/XCSOURCE-Nullverz%C3%B6gerungs-Joystick-Kampfspiele-AC491/dp/B01LAUYMQ6/ref=s9_simh_gw_g23_i1_r?pf_rd_m=A3JWKAKR8XB7XF&pf_rd_s=&pf_rd_r=78MFYY72QMRW2ASYZJTR&pf_rd_t=36701&pf_rd_p=31e89994-24c5-4f2a-aa69-5e32e91703a1&pf_rd_i=desktop

...zur Frage

Raspberry Pi und Relais mit Rückmeldung?

Hallo,

ich habe meinen Raspberry Pi mit einem 8 Kanal Relaisboard verbunden. Sie schalten alle einwandfrei. Jedoch möchte ich, dass wenn das Relai wirklich schaltet (also wenn der GPIO Pin seinen Zustand von High auf Low - oder umgekehrt - ändert) eine simple Rückmeldung gibt.

Sprich wenn die Leitung vom Raspberry Pi zum Relaiboard unterbrochen ist, würde der GPIO Pin trotzdem schalten, aber der Benutzer weiß nicht, ob das Relai wirklich umgeschaltet hat.

Ich stehe etwas auf dem Schlauch. Das Relaiboard hat keine eigenen Bibliothek für solche Rückmeldungen. Kann der GPIO Pin irgendwie kontrollieren, ob am Ende der anderen Leitung das Signal ankommt oder nicht?

Vielen Dank im Voraus für eure Antworten!

...zur Frage

Java verbraucht zu viel Arbeitsspeicher

Wie man im Titel bereits lesen kann, habe ich das Problem, dass ich Java zwar nur 512 MB zugewiesen habe, damit andere Prozesse besser und flüssiger nebenbei laufen können, mir im Task Manager allerdings angezeigt wird, dass es über 1200 MB verbraucht. Wie kann ich dieses Problem beheben und was habe ich genau falsch gemacht?

Ich habe unter Systemsteuerung-> Java -> Java-> Ansicht den Runtime Parameter auf -Xincgc -Xmx512M true

gestellt.

...zur Frage

Was möchtest Du wissen?