JNI in C++

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
sukka
Beiträge: 42
Registriert: Do Jul 17, 2008 7:49 pm

JNI in C++

Beitrag von sukka » Di Aug 18, 2009 10:21 am

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?

sonic
Beiträge: 29
Registriert: Do Aug 13, 2009 6:58 pm

Re: JNI in C++

Beitrag von sonic » Di Aug 18, 2009 11:06 am

Nee,

bisher hab ich nur den umgekehrten Weg genutzt. Sprich native Funktionen in Java eingebunden.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: JNI in C++

Beitrag von Xin » Di Aug 18, 2009 5:07 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

sukka
Beiträge: 42
Registriert: Do Jul 17, 2008 7:49 pm

Re: JNI in C++

Beitrag von sukka » Mi Aug 19, 2009 10:46 am

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

Code: Alles auswählen

32: undefined reference to `JNI_CreateJavaVM'
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

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: JNI in C++

Beitrag von Xin » Mi Aug 19, 2009 10:53 am

sukka hat geschrieben:Har
Dito.
sukka hat geschrieben:

Code: Alles auswählen

32: undefined reference to `JNI_CreateJavaVM'
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...
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

sukka
Beiträge: 42
Registriert: Do Jul 17, 2008 7:49 pm

Re: JNI in C++

Beitrag von sukka » Mi Aug 19, 2009 1:14 pm

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

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: JNI in C++

Beitrag von Xin » Mi Aug 19, 2009 1:57 pm

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).
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

sukka
Beiträge: 42
Registriert: Do Jul 17, 2008 7:49 pm

Re: JNI in C++

Beitrag von sukka » Mi Aug 19, 2009 1:58 pm

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.

Antworten