c++ Bibliothek einbinden

Status
Nicht offen für weitere Antworten.
J

jenzi

Gast
Hallo,
Ich möchte in einem Java-Prog eine c++ Bibliothek einbinden. Ich weiß das es über jni geht. Aber wie?

ich habe die
JavaTest.h
und die
libJavaTest.so

Die c-Klasse heißt "JavaTest" und die methode "int returnValue(int aValue)".

Kennt jemand ein einfaches Beispiel zum aufrufen einer C-Methode aus Java?

Danke
 
J

jenzi

Gast
Also ich hab mir das jetzt mal angeschaut. Folgende Fragen hab ich da noch:

1. Hab ich keine dll-Files, sondern (wie gesagt) JavaTest.h und die libJavaTest.so.
Ich weiß jetzt nicht wo der Unterschied ist.

2. Sind die Methoden im C-Code nicht als JNICALL-Methode definiert. Da ich später mit diesem Vorgehen auf eine ganze Menge C-Klassen zugreifen will kann ich das auch nicht mal eben einfügen. (außerdem hab ich 0 Ahnung von Cpp)

3. Wie kann ich dem Java-Prog zeigen, wo die Biblio liegt?
 
J

jenzi

Gast
Also zum Verständnis hab ich mir mal ne kleine Bsp.Biblio erstellt.

JavaTest.h
Code:
class JavaTest
{
  public:
    int returnValue(int aValue);
};

JavaTest.cxx
Code:
#include "JavaTest.h"

int JavaTest::returnValue(int aValue)
{
  return aValue;
}

JavaTestMain.cxx
Code:
#include <iostream.h>
#include "JavaTest.h"

int main(int aNbrOfArgs, char** aArgsList)
{
  JavaTest theJavaTest;

  cout << "JavaTest returns " << theJavaTest.returnValue(123) << endl;

  return 0;
}

Jetzt will ich die JavaTest.returnValue aus Java einfach aufrufen. Die Cpp-Files sind als libJavaTest.so gespeichert.
 
J

jenzi

Gast
Achso. Die JavaTestMain ist nicht in der Biblio. Die war nur zum testen.
 
G

Guest

Gast
Also wenn du ne ganze Menge Dateien einbinden willst und keine Ahnung von C++ hast, ist das erstmal schlecht :)

Aber aber nicht hoffungslos. Ich empfehle dir SWIG. Mit SWIG kann man sich die Wrapper klassen mittels eines Konfigurationsfiles generieren lassen. as klappt auch sehr gut und geht ruck zuck!!!

Es dauert allerdings etwas, bis man sich bei komplexeren C-Gebilden (Funktionspointer, void*, etc) einen passenden Konfugurationsfile geschrieben hat, der die Sache so in Java wrappt, das man damit intuitiv arbeiten kann. Aber zu den meisten Sachen findet man in der onlien doku gute Beispiele und von Hand ist auch nicht gerade einfach wenn man nur eine dll und einen Header hat einen void* in Java zu wrappen und damit zu arbeiten.
 
J

jenzi

Gast
OK, was ist wrappen?

Da seh ich ja schon mein Projekt ins Wasser fallen.

Was müsste ich denn tun, damit es funktioniert? In allen C-Files rumschreiben? Das wird aber ne Menge Arbeit.
 

thE_29

Top Contributor
Genau, du musst dir selber .so Objekte erstellen die auf die C/C++ .so zugreift, da Java und C/C++ einfach andere Datentypen hat (bzw Ränge, da ja int in C viel kleiner ist als in Java).
 
J

jenzi

Gast
Kann ich denn die C-Methoden so schreiben, dass ich ihr den Namen der jeweiligen aufzurufenden C-Methode übergebe?
So das die von mir geschriebene Methode die tatsächliche Methode anhand von einer Variablen aufruft?

zB.:
Code:
JNIEXPORT int JNICALL
aufruf(String MetName) {
   return MetName();
}

Oder muss ich dann eine solche Methode für jede der schon vorhandenen C-Methoden schreiben auf die ich zugreifen will?
 
A

Axel

Gast
Also erstmal muss ich den hier Anwesenden Recht geben.
@Jens: Lies erstmal alle verlinkten Artikel/Threads, wenn sie dir angeboten werden. Und allererste Anlaufstelle für Informationen bleibt immer noch SUN mit ihren verschiedenen Java-Artikeln, die einem eigentlich alles Wichtige erklären können. Ich hab auch allein mit deren Hilfe mein erste JNI-Programm gebaut ohne irgendwelche anderen Tutorials oder so zu brauchen.

Eine exzellente Quelle ist z.B. dieses Kapitel eines auf java.sun.com verfügbaren Open Books.

Das dir alle Vorredner gesagt haben, dass das, was du machen willst, nicht geht oder nur über Wrapper geht, liegt vielleicht daran, dass du nicht ganz deutlich gesagt hast, ob du nun eine C/C++-Bibliothek hast, die du nicht entwickelt hast, oder eine, die du selber entwickeln möchtest.

Hast du eine fremde Bibliothek, kannst du die dort enthaltenen Funktionen nicht direkt aus Java mit JNI aufrufen, da JNI zum Einen bestimmte Signaturen der Funktionen fordert, und zum Anderen die Java-Typen nicht mit C-Typen kompatibel sind.
Die einzige Möglichkeit, die du hier hast, ist das "Wrappen". D.h. du baust dir eine Bibliothek, die nichts anderes macht, als deinen Java-Aufruf entgegenzunehmen und die Argumente in C-Typen umwandelt und dann die eigentliche Bibliothek aufruft. Zum Schluss muss natürlich das Ergebnis in Java-Typen umgewandelt werden.

Baust du dir selber eine Bibliothek, die du aufrufen willst, dann bist du komplett frei, welche Typen du nutzt. Du kannst auch direkt mit Java-Typen arbeiten (also mit den JNI-Strukturen, die diese darstellen).

Genereller Ablauf:
1. Java-Klasse schreiben mit deiner nativen Methode ("[modifier] native [return_type] [name]([arguments])"), und dem Befehl zum Laden der Bibliothek
2. Kompilieren der Java-Klasse
3. Generieren der Header-File mit javah
4. Implementieren deines nativen Codes mit der eben erzeugten Header-File
5. Kompilieren des nativen Codes zu der gewünschten Bibliothek

Wenn du eine fremde Bibliothek hast, dann machst du im 4. Schritt nichts anderes, als den Aufruf für die eigentliche Bibliothek zu übersetzen und zu delegieren...

Ich hoffe das war hilfreich soweit. Und lies das verlinkte Buch-Kapitel!
 
A

Axel

Gast
Hmm, leider geht Edit als Anonymer nicht...Egal.

@Jens: Die Idee eines nativen Dispatchers für beliebig viele und beliebig verschiedene Funktionen ist etwas arg abstrus (in meinen Augen). In Java könnt ich mir sowas ja mit Reflection noch vorstellen, aber eine ähnliche Funktionalität gibt es meines Wissens nicht C/C++ (Wie auch?). Damit würde nur die Möglichkeit einer massiven "Funktions-Registry" mit enormen Kontrollstrukturen und Typumwandlungen bleiben. Ich glaub selbst mit Funktionspointern wird das ein Unding sein...
 

thE_29

Top Contributor
Naja, in C/C++ kann man Funktionn (callback Funktionen) auch übergeben!

Und man kann Pointer auf Funktionen erstellen und diese dann aufrufen! Also würde es von der Idee her, vielleicht sogar gehen!

Problem is halt, das er in einem Array die Parameter der Methoden übergeben muss, sowie Rückgabewerte.. (da ja nicht immer alles den gleichen return Wert hat).

Das mit den Funktionspointer geht 100% unter Windows, da man oft Funktionen aus dlls nachladen muss und die somit aufruft (sprich genau das was er will).
Nur unter Linux habe ich das ganze noch nicht gemacht!
 
A

Axel

Gast
Ja gut, ich meinte auch weniger, dass das mit Funktionspointern nicht geht, sondern dass das, so wie du beschrieben hast, mit weiteren weiteren Anforderungen versehen ist und daher in meinen Augen keines realistischen Versuchs würdig ist.

Gut, ich muss dazu sagen, dass ich ihn persönlich kenne und daher weiß, in welchem Zeitrahmen er so etwas erledigen müsste (zusammen mit dem, was er ja eigentlich erledigen will)...
 
G

Gast

Gast
Ich kann nur nochmal betonen guck dir SWIG an, der generiert dir fast alles selber, dabrauchst du nur wenig C kenntinsse. Wobei um Callbacks/Funktionspointer umusetzten ist doch etwas arbeit nötig, aber vielllllll weniger als von hand.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Suche aktuelle Apache Poi Bibliothek zum Einbinden in mein Programm Allgemeine Java-Themen 2
M *.dll Datei (Bibliothek) in Eclipse einbinden Allgemeine Java-Themen 9
krgewb Java-Bibliothek für ONVIF Allgemeine Java-Themen 1
X Java gewerblich nutzen mit externe Bibliothek. Was zu beachten? Allgemeine Java-Themen 18
A Java ListNode Element einfügen ohne Bibliothek Allgemeine Java-Themen 6
S Bibliothek gleichzeitig fuers JDK und Android entwickeln Allgemeine Java-Themen 8
G JavaDocu in eigener Bibliothek Allgemeine Java-Themen 2
R Input/Output Programmierung mithilfe der Robot Bibliothek Allgemeine Java-Themen 15
Pr0m3theus Buch Java-Standart-Bibliothek Allgemeine Java-Themen 1
J eigene Java Bibliothek Allgemeine Java-Themen 2
L Bibliothek für kommerizielle Anwendungen validieren? Allgemeine Java-Themen 0
J Beste Musik Bibliothek Allgemeine Java-Themen 12
J Java PIM-Bibliothek Allgemeine Java-Themen 0
Developer_X Geographie Bibliothek Allgemeine Java-Themen 4
R Bibliothek für Darstellung von char auf 5x7 Dot-Matrix Allgemeine Java-Themen 2
M Serielle Schnittstelle ansteuern - mit Processing Bibliothek Allgemeine Java-Themen 4
A Bibliothek für NP-harte Zuordnung gesucht. Allgemeine Java-Themen 7
K Java Mathematik Bibliothek Allgemeine Java-Themen 3
R JavaScript cruncher als Java Bibliothek Allgemeine Java-Themen 4
Guybrush Threepwood Neuronale Netzwerke - Bibliothek gesucht Allgemeine Java-Themen 3
D NetBeans Bibliothek kann nicht genutzt werden Allgemeine Java-Themen 5
R Fehler: Bibliothek bereits geladen Allgemeine Java-Themen 3
S Eigene Bibliothek Allgemeine Java-Themen 2
as182005 Bibliothek für Graph Visualisierung gesucht Allgemeine Java-Themen 3
S Bibliothek für Quellcodeerzeugung Allgemeine Java-Themen 3
M Java Bibliothek für Kennzahlen Visualisierung Allgemeine Java-Themen 2
H Java Bibliothek für UML Diagramme? Allgemeine Java-Themen 2
SuperSeppel13 Packete der Java Bibliothek ins eigene Prjekt integrieren Allgemeine Java-Themen 4
G ANT Tutorial . Schritte bzgl. Junit Bibliothek Allgemeine Java-Themen 4
O Java Bibliothek Allgemeine Java-Themen 5
G Bibliothek-Mathematik (Statistik) Allgemeine Java-Themen 2
J Bibliothek gesucht Ana_lysieren von wss. Referenzen Allgemeine Java-Themen 2
Luma Arbeitsverzeichnis innerhalb externen Bibliothek ändern Allgemeine Java-Themen 2
0 Konfiguration lesen / schreiben - Bibliothek dafür? Allgemeine Java-Themen 3
G Bibliothek für Port? Allgemeine Java-Themen 2
B Drucken - welche Bibliothek favorisiert Ihr? Allgemeine Java-Themen 16
A Java PDF Bibliothek für Volltextsuche Allgemeine Java-Themen 2
B ASCII-Gui Bibliothek Allgemeine Java-Themen 2
DEvent Bibliothek zur Konsolenprogrammierung Allgemeine Java-Themen 6
M Java Bibliothek Allgemeine Java-Themen 3
M BrowsCap Bibliothek Allgemeine Java-Themen 6
Luma OpenSource-Bibliothek für den Zugriff auf USB- und COM-Ports Allgemeine Java-Themen 8
P Grafik Bibliothek Allgemeine Java-Themen 4
B Bug in JIMI Bibliothek Allgemeine Java-Themen 3
C Bibliothek o. ä. für SPS-Bausteinsimulation Allgemeine Java-Themen 3
F Neue Bibliothek dem JDK hinzufügen Allgemeine Java-Themen 5
U Einbinden libphonenumber Allgemeine Java-Themen 3
T Externe Java Klasen zur Laufzeit einbinden Allgemeine Java-Themen 10
J Probleme beim einbinden von Zip4j library Allgemeine Java-Themen 6
E Zahlungsmöglichkeiten im Web-App einbinden Allgemeine Java-Themen 4
T StdCall DLL in Java einbinden Allgemeine Java-Themen 13
N HashMap und Methoden richtig einbinden Allgemeine Java-Themen 2
S Eclipse TestNG: Textfeld einbinden? Allgemeine Java-Themen 1
J Generische Interfaces mehrfach einbinden Allgemeine Java-Themen 11
S Eclipse Github Projekt in eigenes Projekt einbinden und nutzen Allgemeine Java-Themen 13
T iText mit eclipse richtig in Java-Projekt einbinden Allgemeine Java-Themen 2
Pataraca Vererbung Code einbinden Allgemeine Java-Themen 3
MaxG. Bilddateien richtig einbinden Allgemeine Java-Themen 9
J Historische Börsendaten einbinden Allgemeine Java-Themen 14
H API einbinden Allgemeine Java-Themen 5
A Applet in HTML einbinden Allgemeine Java-Themen 1
N Eclipse Projekt von GitHub in bestehendes Projekt einbinden Allgemeine Java-Themen 13
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
S Eclipse Annotation Processor in Eclipse einbinden Allgemeine Java-Themen 0
T Eclipse Dll einbinden java.lang.UnsatisfiedLinkError nur in Eclipse nicht via javac Allgemeine Java-Themen 1
D VBScript in .jar einbinden und aufrufen Allgemeine Java-Themen 5
M Datenbankdatei in Java einbinden Allgemeine Java-Themen 16
T C DLL einbinden und Pointer übergeben Allgemeine Java-Themen 13
C images einbinden Allgemeine Java-Themen 7
T Dll erstellen und einbinden Allgemeine Java-Themen 1
S Externe Eclipse Projekte dynamisch einbinden Allgemeine Java-Themen 3
Thallius Externe .jar dynamisch einbinden Allgemeine Java-Themen 5
X 3d Modelle einbinden Allgemeine Java-Themen 1
Developer_X OpenStreetMap in Java Programm einbinden Allgemeine Java-Themen 10
M Eclipse libgcrypt für window in java Projekt einbinden Allgemeine Java-Themen 1
K Website in Programm einbinden und auslesen Allgemeine Java-Themen 2
M File IO Klasse ... wie einbinden Allgemeine Java-Themen 6
P Sprache ändern ins Programm einbinden Allgemeine Java-Themen 6
L Classpath Klasse einbinden Allgemeine Java-Themen 8
A NodeJs/Javascript txt.Datei einbinden Allgemeine Java-Themen 2
M Barcode und Bilder in PCL einbinden Allgemeine Java-Themen 0
M Variablen Variablen in Text einbinden Allgemeine Java-Themen 5
J rxtxserial.dll für 32 oder 64bit dynamisch einbinden Allgemeine Java-Themen 9
M Javaprogrammierung in Webapp einbinden Allgemeine Java-Themen 7
U Eclipse Java Projekt - Webservice einbinden Allgemeine Java-Themen 7
M Text datei in java jar datei einbinden Allgemeine Java-Themen 4
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
J excel einbinden Allgemeine Java-Themen 2
S Android: SQLite Framework einbinden Allgemeine Java-Themen 2
G JNotfiy-DLL einbinden Allgemeine Java-Themen 4
R Batch / Shell-Skript in Jar.Datei einbinden? Allgemeine Java-Themen 5
S OOP Problembereichsmodell: Bestehende Framework Klasse in eigene Klassenstruktur einbinden Allgemeine Java-Themen 9
B Input/Output Einbinden von Daten in Java Allgemeine Java-Themen 3
L Einbinden von Daten in ausführbare Jar Allgemeine Java-Themen 6
E Assembler einbinden Allgemeine Java-Themen 3
X Applet läuft nicht, Applet in Webseite einbinden Allgemeine Java-Themen 4
P Applet java 1.7 in Website einbinden ? Allgemeine Java-Themen 7
P Applet Applet einbinden Probleme Allgemeine Java-Themen 2
T Bild in jar Paket einbinden Allgemeine Java-Themen 9
P Icon aus Exe einbinden Allgemeine Java-Themen 12

Ähnliche Java Themen

Neue Themen


Oben