Seite 1 von 1
JNI in C++
Verfasst: Di Aug 18, 2009 10:21 am
von sukka
Hallo zusammen,
hat einer von euch schonmal versucht das JNI (Java Native interface) in C++ zu benutzen um Java Quellcode in C++ verfügbar zu machen?
Re: JNI in C++
Verfasst: Di Aug 18, 2009 11:06 am
von sonic
Nee,
bisher hab ich nur den umgekehrten Weg genutzt. Sprich native Funktionen in Java eingebunden.
Re: JNI in C++
Verfasst: Di Aug 18, 2009 5:07 pm
von Xin
sukka hat geschrieben:Hallo zusammen,
hat einer von euch schonmal versucht das JNI (Java Native interface) in C++ zu benutzen um Java Quellcode in C++ verfügbar zu machen?
1.)
http://www.java-forum.org/allgemeine-ja ... rufen.html
2.) Ich habe mal in einer mehr oder minder beliebten Informationsmanagement-Firma diverse Frameworks durchleuchtet, um genau das rauszufinden.
Schön war das alles nicht, es gibt aber 2-3 Frameworks dafür. Ich weiß aber nicht mehr, wie sie im einzelnen hießen. Vielleicht habe ich den Block noch zu Hause und da steht's noch drin.
Fakt ist: Willst Du eine Java-Funktion rufen, musst Du eine JVM laufen haben. Java aus C++ zu rufen hat daher nicht wirklich Sinn.
Re: JNI in C++
Verfasst: Mi Aug 19, 2009 10:46 am
von sukka
Har,
vielen Dank für die Info, das hat ja jetzt auch schonmal funktioniert, jetzt kommt aber eine Fehlermeldung, die ich überhaupt nicht nachvollziehen kann
Code: Alles auswählen
#include <iostream>
#include <string>
#include <jni.h>
using namespace std;
int main(void)
{
//Hello World in C++
cout << "Hello World in C++";
//Java VM anlegen
JavaVM *jvm;
//Native Javamethoden verfügbar machen
JNIEnv *env;
JavaVMOption options[1];
//Initialargumente für die JavaVM
JavaVMInitArgs vm_args;
//JNI Version festlegen
vm_args.version = JNI_VERSION_1_6;
JNI_GetDefaultJavaVMInitArgs(&vm_args);
options[0].optionString = "....";
vm_args.nOptions = 1;
vm_args.options = options;
jint value;
// JavaVM erzeugen:
value = JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);
if(value < 0)
{
cout << value << " : ";
switch(value)
{
case JNI_ERR:
cout << "JNI_ERR" << endl;
break;
case JNI_EDETACHED:
cout << "JNI_EDETACHED" << endl;
break;
case JNI_EVERSION:
cout << "JNI_EVERSION" << endl;
break;
case JNI_ENOMEM:
cout << "JNI_ENOMEM" << endl;
break;
case JNI_EEXIST:
cout << "JNI_EEXIST" << endl;
break;
case JNI_EINVAL:
cout << "JNI_EINVAL" << endl;
break;
}
return -1;
}
else
cout << "CreateJavaVM success!!" << endl;
jclass javaKlasse;
if (javaKlasse = env->FindClass("testing"))
cout << "Klasse gefunden!" << endl;
else
cout << "Klasse nicht gefunden AUTSCH!" << endl;
jmethodID testmethod1;
if (testmethod1 = env->GetStaticMethodID(javaKlasse, "testmethod1", "([Ljava/lang/String;)V"))
{
cout << "Methode testmethod1 gefunden!\n" << "jetzt wird die Methode ausgefuehrt\n";
env->CallStaticVoidMethod(javaKlasse, testmethod1, 0);
}
else
cout << "Methode nicht gefunden! Du machst da was falsch!\n";
cout << "JavaVM hat fertisch!\n Jetzt machen wir sie kapott!\n";
jvm->DestroyJavaVM();
return 0;
}
Die Fehlermeldungen sind:
Code: Alles auswählen
23: undefined reference to `JNI_GetDefaultJavaVMInitArgs'
und
ich bin ein wenig ratlos, da beide Referenzen in der jni.h hinterlegt sind und auch gehighlightet werden, dennoch findet er die nicht, das verstehe ich nicht.
Grüße,
Sukka
Re: JNI in C++
Verfasst: Mi Aug 19, 2009 10:53 am
von Xin
sukka hat geschrieben:Har
Dito.
sukka hat geschrieben:
ich bin ein wenig ratlos, da beide Referenzen in der jni.h hinterlegt sind und auch gehighlightet werden, dennoch findet er die nicht, das verstehe ich nicht.
Du wirst irgendwo eine jni.lib (oder ähnlich) haben. Diese Library musst Du in die Linker-Optionen Deines Compilers eintragen. (Bei Wiesau Studio rechtsklick auf das Projekt, Eigenschaften, Linker, Eingabe). In der .lib sind die Funktionen drin, die der Linker sonst nicht findet: undefined reference to...
Re: JNI in C++
Verfasst: Mi Aug 19, 2009 1:14 pm
von sukka
Das mit dem Includen hat leider nicht funktioniert, unter Eclipse funtktioniert das ja ähnlich wie unter Visual Studio Rechtsklick auf Projekt --> Paths and Symbols --> Library Paths... aber neee... ich hab mir jetzt auch ne Umgebungsvariable gesetzt die auf meine dynamische Library verweist LD_Library_Path aber auch das hat nicht geholfen, ich probiere weiter rum, ich meld mich wenn ich irgendwas gefunden habe
Re: JNI in C++
Verfasst: Mi Aug 19, 2009 1:57 pm
von Xin
sukka hat geschrieben:Das mit dem Includen hat leider nicht funktioniert, unter Eclipse funtktioniert das ja ähnlich wie unter Visual Studio Rechtsklick auf Projekt --> Paths and Symbols --> Library Paths... aber neee... ich hab mir jetzt auch ne Umgebungsvariable gesetzt die auf meine dynamische Library verweist LD_Library_Path aber auch das hat nicht geholfen, ich probiere weiter rum, ich meld mich wenn ich irgendwas gefunden habe
Es geht
nicht um Includes! Der Compiler ist schon erfolgreich gelaufen, der Linker streikt!
Du musst dem Linker eine .LIB Datei angeben, die jni.lib. Der Linker wird häufig über den Compiler mitkonfiguriert. Unter Eclipse kann ich Dir leider nicht sagen, wo das einzustellen ist. Die Option für den GCC heißt jedenfalls -l (-L kleingeschrieben, nicht -i großgeschrieben).
Re: JNI in C++
Verfasst: Mi Aug 19, 2009 1:58 pm
von sukka
Also...
folgendes fehlte, damit das Ganze zum Laufen bewegt werden konnte:
in den EclipseOptionen (Rechtsklick auf das Projekt--> Eigenschaften) fehlte nmoch unter c/C++ Build --> Settings --> GCC++ Linker --> Libraries der Eintrag jvm, dieser ist wichtig, da ansonsten der Linker nicht weiß wie er eine Java VM erstellen soll oder kann.