Einbetten von Java in einer C++ - Anwendung?
Ich habe eine Anwendung geschrieben in C++ und ich bin in der Lage, erweitern Sie die Anwendungen, die Funktionalität durch das schreiben von plugins in C++.
Was ich im Grunde tun möchten, ist das einbetten von Java in dieser Anwendung. Dieses geschieht bereits mit Python (nicht von mir).
Lese ich etwas über JNI, aber es ist immer die Rede von einer vollständigen programm verwendet die Java-Klassen.
Was ich tun möchte ist, die Verwendung von Klassen aus C++ in Java, um mit der Anwendung interagieren.
Es ist eine 3D-Anwendung, in diesem Fall nennt Cinema 4D.
Gibt es eine Möglichkeit, zu kompilieren und bewerten von Java-code, während die Anwendung ausgeführt wird (in einer Art Skriptsprache) mittels JNI oder so etwas ?
Beispiel imaginären code nach der Einbettung gemacht wurde:
import c4d.documents.*;
class Main {
public static void main() {
BaseDocument doc = GetActiveDocument();
BaseObject op = doc.GetActiveObject();
if (op != null) {
op.Remove();
}
}
}
Dieser code sollte die Interaktion mit Cinema 4D zum löschen des ausgewählten Objekts.
Warum sagen Sie "eine Art scripting-Sprache", wenn Sie ' ve bereits festgestellt, dass diese Sprache muss Java sein?
Das ist eigentlich noch offen, die grundlegende Interaktion zwischen Java und der Anwendung wäre Super für den Anfang.
Es sollte nicht sein, die müssen die Anwendung neu starten, um neu hinzugekommene Java-code, ich will schreiben 'IDE' innerhalb von C4D, wo Sie können den code direkt
Interaktion" klingt wie eine große Aufgabe für einen socket.
InformationsquelleAutor Niklas R | 2011-09-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie einbetten einer JVM innerhalb Ihrer Anwendung. Oracle offizielle Nachschlagewerk hat einige weitere details. Die Synopse ist:
Können Sie weit mehr tun, anspruchsvolle Dinge, wenn Sie wollen (z.B. custom class loader), aber das ist über es in Bezug auf das absolute minimum benötigt, um eine JVM die Arbeit innerhalb Ihrer Anwendung.
Mit swig kann man erzeugen Bindungen, mit denen Sie Anrufe tätigen, um C++ von java. Die Frage impliziert, Sie wollten es auf diese Weise, obwohl. Sie können auch beides in einem Programm.
Meine zwei cents: da die OP will, plugins zu laden, ich denke, er sollte auch darüber Lesen, wie benutzerdefinierte class loader ermöglicht ihn zu Lesen, ein "plugin jar". Außerdem müssen Sie die Java-Klassen mit nativen Methoden (ie JNI) zum Aufruf von C++ aus Java.
InformationsquelleAutor Flexo
Scheint es einige Verwirrung darüber, ob Sie möchten, einbetten von Java in die C++ - app oder die andere Weise herum. Ich werde jeden Fall.
Für die Einbettung von java in c++ app können Sie ein socket-Aufruf des java-Programms. Auf java Ende, die Sie verwenden SocketServer und auf der C++ beenden, verwenden Sie die Allgemeine Socket Layer library. Dies ist bei weitem die einfachste und am besten skalierbaren Ansatz. Als java-Arbeitsbelastung wird immer größer, Sie halten das hinzufügen zusätzlicher jvm. Etwas kompliziert zu implementieren, aber es funktioniert wirklich gut.
Für die Einbettung von C++ Anwendung in java. Das ist ganz einfach. Kompilieren Sie C++ - app in eine shared library und JNI verwenden, um es aufzurufen.
InformationsquelleAutor RHT
Den JNI-Aufruf-API unterstützt diese, wie beschrieben von @awoodland. Hier ist ein Aktueller link für Java 6/7.
Für diese könnte man verwenden Sie eine der folgenden:
BeanShell oder Groovy, unter anderen, möglicherweise für Sie von Interesse sein. Beide unterstützen dynamisch interpretierter code, läuft auf der JVM.
InformationsquelleAutor Andy Thomas
Arbeite ich schon in etwas ähnlich in letzter Zeit. Was für mich gearbeitet wurde mit der Bibliothek jni.h, die kommt, wenn Sie installieren Sie java (Java\jdk[version]\include) und das erstellen einer dll mit c/c++ - code in visual studio. Zum Beispiel:
Test.h
Test.cpp
Dann eine dll erstellen, die mit Visual Studio und laden Sie die dll in ein statische block.
Ich habe nicht versucht, die ohne Kompilierung des c/c++ - code in einer dll, vielleicht gibt es eine andere Möglichkeit zum Aufruf des c/c++ - code. Aber das ist, wie Sie es umsetzen.
Test.java
Also, tun Sie nur, und implementieren java-Methoden mit allen c/c++ Sie wollen.
Wenn Sie noch nicht wissen, wie es zu tun, erleuchten sich hier:
Java Native Interface Specification - Oracle
Java Native Interface - Wikipedia
InformationsquelleAutor 0rkan
Für das Szenario, das Sie beschreiben, JNI ist wahrscheinlich der beste Weg zu gehen. Sie würde das aussetzen der Funktionalität der C++ - app als eine DLL, die eingebaut werden können in und aus einer Java-Anwendung.
InformationsquelleAutor Perception
Müssen Sie wahrscheinlich zu überdenken Sie Ihre design. Java ist keine gute Wahl für diese Art von Aufgaben. Es gibt keine
eval()
Funktion in der java-standard-Bibliothek, ähnlicheval()
von python oder shell.Können Sie erstellen, die eine java-VM in C++ - code mittels JNI, aber es ist schwer. Es ist noch die Frage, wie man erstellen Sie eine bytecode vom java-Quellcode. Haben Sie zum einbetten eine Menge code zu kompilieren und ausführen von java-code in C++. Tun Sie das nicht. Es muss eine bessere Lösung.
Können Sie zum Beispiel verwenden einige RPC (SOAP, XML-RPC, Corba) zwischen dem C++ - code und eigenen java-code. Wenn Sie brauchen, um einige
eval()
-wie java-Aufruf, die Sie verwenden können, Groovy oder Jython (beides hateval()
, Zugriff auf alle standard-java-Bibliothek und kann auf reguläre java-Klassen).InformationsquelleAutor Michał Šrajer