Ich haette wieder einmal eine Frage. Man kann ja in Java Interfaces schreiben, welche dann als Schnittstelle für sich selbst oder andere Entwickler dienen können. Ist es nun möglich so eine Schnittstelle auch fuer Entwickler einer komplett anderen Programmiersprache zur Verfuegung zu stellen? Also dass aus Program B, geschrieben in C++ (Beispiel), API Methoden aus JavaProgramm A aufgerufen werden können. Klar, man könnte jetzt sagen "Ruf mit Programm B doch einfach Programm A mit x Runtimeargumenten auf!", jedoch waere das in bestimmten Situationen bloed, da man beispielsweise mit Programm A schon irgendwelche komplexe Sachen geladen hat, welche bei jedem Neustart neugeladen werden.
ähm ... ist so direkt nicht möglich .. zumindest nicht in die richtung C -> Java
andersrum ... also Java -> C geht das schon eher
das problem auch hier ist allerdings : shared memory
das heißt also das jede instanz einer JNI-lib grundsätzlich ihren eigenen bereich hat in dem sie gültig ist ... was auch der grund ist warum shared memory nur mit statischen daten funktioniert ... man kann also keine direkten pointer weitergeben
ich hab das ganze auch mal vorgehabt ... und wollte mit einer JNI-lib eine direkte inter-prozess-kommunikation zwischen zwei unabhängigen VMs (ist ja am ende das gleiche) herstellen
mein plan war die lib in beiden VMs zu laden und dann die VM-pointer in den shared-mem bereich zu packen ... das problem in C ist allerdings das pointer auch nur verweise auf speicherbereiche enthalten ... und zwar nur in ihrem eigenen speicherbereich
wenn also in VM A der VM-pointer z.b. auch speicher-block 100 zeigt ... ist dieser erstmal nur programm lokal und kann absolut irgendwo im speicher liegen ... z.b. an stelle 100
in VM B ist der VM-pointer jetzt z.b. 200 ... und liegt im physischen RAM z.b. auf der absoluten stelle 2000
was passiert
VM-A will pointer B callen ... versucht also im lokalen block adresse 200 anzuspringen ... was dann im RAM aber nur adresse 1100 ist ... wo ganz andere daten liegen
gleiches umgekehrt : VM-B will pointer A callen ... ruft im lokalen block adresse 100 auf ... die im RAM auf block 1900 zeigt ...
man kann pointer also nicht zwischen zwei verschiedenen instanzen im shared-memory speichern ... mal von abgesehen das sie im physischen RAM nicht auf die selbe stelle zeigen liegt im lokalen block vielleicht noch ganz anderer krams was dann zu fatalen system-fehlern oder speicher-zugriffs-fehlern führt ... bis hin zu nem blue-screen ... (hatte testweise debugging aktiv und damit soeiniges an sicherheit außer kraft gesetzt ... fand mein windows nicht ganz so cool)
das einzige was möglich ist ... und dabei beziehe ich mich jetzt nur mal auf windows und zwei VMs ... in der jni-lib ein sog. memory-mapped-file anzulegen auf das beide prozesse zugriff haben ... und dann über den system-event-bus zu arbeiten
unter windows und der lib die ich dazu aufgetrieben habe wird das ganze über ein verstecktes dummy-window gelöst das ein message-broadcast abfangen kann um so zu wissen : aha, daten sind jetzt ready ...
um also noch mal auf die grundlegende frage zurückzukommen ob es irgendwie möglich in java eine direkte schnittstelle für ein anderes programm bereit zu stellen
öhm ... so wie du es dir vorstellst ... nein
grund : es muss erstmal die VM laufen damit du überhaupt dran kommen würdest ... und da du selbst mit native-shared-memory nicht direkt auf fremde instanzen zugreifen kannst brauchst du irgendein message-bus-system vom jeweiligen OS um die andere instanz darüber dann zu informieren das daten bereit zu lesen sind
außerdem kann man damit nur in eine richtung gleichzeitig arbieten ... hier ist also noch zusätzlich synchronisation zwischen beiden apps nötig
einfacher würde es hier nach dem server-client prinzip gehen
du stellst einen server bereit und gibst dazu ein protokoll vor über das dann daten ausgetauscht werden können ...
und noch zum punkt interface
ist zwar richtig das man damit eine "schnittstelle" vorgibt ... allerdings braucht es auch eine konkrete implementierung und einen weg an diese ran zu kommen ohne sie selbst zu kennen
z.b. über factories
kleine beispiel
ich gebe dir eine lib mit der du nur mit interfaces arbeitest ... sie besteht also für dich nach außen hin nur aus einem package mit ner reihe an interfaces
zusätzlich gebe ich dir eine Factory mit der du entsprechende instanzen erzeugen kannst ...
du kennst also letzten ende trotzdem nur die interfaces und die factory welche dir implementierungen liefert ...
und genau DAS kann man so zwischen verschiedenen sprachen nicht umsetzen ...
ich kann dir kein java-interface vorgeben ... dann aber eine factory schreiben die dir ein DotNET-VB-objekt liefert
auch nicht mit shared-memory über native code ...
als abschließende antwort würde ich dir folgendes geben
du bist also letzten ende immer darauf angewiesen primes (also primitive und vllt noch strings) über einen daten-kanal zu senden ... socket oder mem-mapped-file oder wie auch immer ... und dir selbst daraus wieder alles zusammen zu bauen