OWLPI und C++

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

OWLPI und C++

Beitrag von sukka » Do Sep 03, 2009 5:59 pm

Hallo zusammen,

ich versuche grad die OWLAPI in C++ verfügbar zu machen und stoße dabei zusehens auf Probleme

hier ist der Code:

Code: Alles auswählen

#include "/usr/local/jdk1.6.0_16/include/jni.h"
#include <iostream>
#include <string>
using namespace std;


int main (void)
{

	char classpath0[] = "-Djava.class.path= /home/renne/owlapi/owlapi/org/semanticweb/owl/apibinding/";
	char classpath1[] = "-Djava.library.path= /usr/lib/jvm/java-6-openjdk/jre/lib/i386/server/libjvm.so";
	//string classpath2;
	//classpath0 = "-Djava.class.path= /home/renne/owlapi/owlapi";
	//classpath1 ="-Djava.library.path= /usr/lib/jvm/java-6-openjdk/jre/lib/i386/server/libjvm.so";
	//char* cp0 = classpath0.c_str();
	//char* cp1 = classpath1.c_str();
	JavaVM *jvm;
	JNIEnv *env;    //Native Javamethoden verfügbar machen
	JavaVMInitArgs vm_args;    //Initialargumente für die JavaVM
	vm_args.version = JNI_VERSION_1_6; //JNI Version festlegen
	JavaVMOption options[3];

	JNI_GetDefaultJavaVMInitArgs(&vm_args);

	options[0].optionString = classpath0;
	options[1].optionString = classpath1;
	//options[2].optionString = classpath2;
	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 = env->FindClass("OWLManger");

	if (javaKlasse == NULL)
		cout << "Klasse nicht gefunden!" << endl;
	else
		cout << "Klasse gefunden!\n";

	jmethodID testmethod1 = env->GetStaticMethodID(javaKlasse, "createOWLOntologyManager", "()V");

	if (testmethod1 == NULL)
	{
		cout << "Methode nicht gefunden!\n ";
	}
	else
	{
		cout << "Methode " << testmethod1 << " gefunden!\n" << "jetzt wird die Methode ausgefuehrt\n";
		env->CallStaticVoidMethod(javaKlasse, testmethod1, 0);
	}

	cout << "JavaVM hat fertisch!\n Jetzt machen wir sie kapott!\n";

	jvm->DestroyJavaVM();
	return 0;
}
die JavaVM findet allerdings meine Klassen und Methoden nicht, und ich hab keine Ahnung warum das nicht funktioniert, da bisher genau diese Methode bei eigenen Javaklassen wunderbar funktioniert hat.

Jetzt findet die JavaVM allerdings meine Methoden nicht mehr und ich weiß nicht warum nicht.

So sieht das in Java aus, wenn ich dort die Methoden der OWLAPI aufrufe

http://owlapi.svn.sourceforge.net/viewv ... iew=markup

Hat irgendwer eine Idee?

Grüße,

René

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

Re: OWLPI und C++

Beitrag von Xin » Fr Sep 04, 2009 8:14 am

Was heißt 'er findet nicht'?

Was ist die Ausgabe des Programms? Wie weit kommt er?
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: OWLPI und C++

Beitrag von sukka » Fr Sep 04, 2009 8:27 am

Wie man im Quellcode ja sehen kann überprüfe ich:

Code: Alles auswählen

   jclass javaKlasse = env->FindClass("OWLManger");

   if (javaKlasse == NULL)
      cout << "Klasse nicht gefunden!" << endl;
   else
und ich weiß ja, dass die Klasse OWLManager in genau diesem Pfad liegen muss:

Code: Alles auswählen

char classpath0[] = "-Djava.class.path= /home/renne/owlapi/owlapi/org/semanticweb/owl/apibinding/";
Ich hab sie ja da hingepackt.

Wie man am Beispiel von Sourceforge.net sehen kann:

Code: Alles auswählen

import org.semanticweb.owl.apibinding.OWLManager;
und hier:

Code: Alles auswählen

OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
stimmen Klassenpfad und Klassenname überein... trotzdem krieg ich als Wert für "JavaKlasse" ne 0x0 zurück.

Zu deiner Frage, das Programm läuft durch, da ich ja eventuelle Fehler abfange

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

Re: OWLPI und C++

Beitrag von Xin » Fr Sep 04, 2009 8:31 am

sukka hat geschrieben:Wie man im Quellcode ja sehen kann überprüfe ich:

Code: Alles auswählen

   jclass javaKlasse = env->FindClass("OWLManger");

   if (javaKlasse == NULL)
      cout << "Klasse nicht gefunden!" << endl;
   else
und ich weiß ja, dass die Klasse OWLManager in genau diesem Pfad liegen muss:
Dein Computer weiß es scheinbar besser. ^^

Vielleicht schaust Du mal, was Du env alles so fragen kannst. Vielliecht gibt es die Möglichkeit, env zu fragen, wo es überall sucht oder welche Klassen es überhaupt findet.
sukka hat geschrieben:

Code: Alles auswählen

char classpath0[] = "-Djava.class.path= /home/renne/owlapi/owlapi/org/semanticweb/owl/apibinding/";
Ich hab sie ja da hingepackt.
Inkl. Leerzeichen vor /?
sukka hat geschrieben:Zu deiner Frage, das Programm läuft durch, da ich ja eventuelle Fehler abfange
Ich emfinde "Klasse nicht gefunden" nicht als durchlaufen... an der Stelle läuft's schief und bricht ab. Durchlaufen würde es wohl im else-Zweig.
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: OWLPI und C++

Beitrag von sukka » Do Okt 01, 2009 10:50 am

Hmpf,

jetzt wird zwar die Klasse gefunden, die Methode allerdings nicht... woran das liegt, das weiß der Kuckuck

Code: Alles auswählen

	char classpath[] = "-Djava.class.path=/home/username/owlapi/owlapi-bin.jar";
	char libpath[] = "-Djava.library.path=/usr/lib/jvm/java-6-sun-1.6.0.10/jre/lib/i386/server/libjvm.so";
	char classname[] ="org/semanticweb/owl/apibinding/OWLManager"; //
	char methodname[] = "createOWLOntologyManager";
	OwlApiCpp testobject1;
eigentlich sollte "createOWLOntologyManager innerhalb der Klasse OWLManager zu finden sein. Ist allerdings nicht der Fall

viele Grüße,

sukka

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

Re: OWLPI und C++

Beitrag von Xin » Do Okt 01, 2009 1:06 pm

sukka hat geschrieben:eigentlich sollte "createOWLOntologyManager innerhalb der Klasse OWLManager zu finden sein. Ist allerdings nicht der Fall
Ist die Betrachtung von statischen bzw. objektgebundenen Methoden unterschiedlich?

Create klingt 'statisch'... vielleicht muss man für die Suche danach ein zusätzliches Flag angeben?
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: OWLPI und C++

Beitrag von sukka » Do Okt 01, 2009 2:55 pm

Ich hab die Möglichkeit ne getmethodID() zu rufen und ne getstaticmethodID, macht beides keinen Unterschied, er findet trotzdem nix. Der Unterschied ist wie du schon sagtest einmal ne statische und einmal eine nichtstatische Methode zu rufen

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

Re: OWLPI und C++

Beitrag von Xin » Do Okt 01, 2009 3:34 pm

sukka hat geschrieben:Ich hab die Möglichkeit ne getmethodID() zu rufen und ne getstaticmethodID, macht beides keinen Unterschied, er findet trotzdem nix. Der Unterschied ist wie du schon sagtest einmal ne statische und einmal eine nichtstatische Methode zu rufen
Jow... und was ist Deine Methode?

Und was ist eine ID?
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: OWLPI und C++

Beitrag von sukka » Mi Okt 07, 2009 7:45 am

Wuusaaaa...

ich komm mal wieder dazu zu schreiben...

Meine Signatur war falsch, die Methode liefert einen Rückgabewert.

siehe hier: (http://owlapi.svn.sourceforge.net/viewv ... iew=markup)
der Rückgabewert der Methode ist also:
env->GetStaticMethodID(FindClass(className.c_str()), methodName.c_str(), "()Lorg/semanticweb/owl/model/OWLOntologyManager;");

Zu deinen Fragen: Die Methode ist static -.- und... eine ID ist nichts weiter als der Name der Methode



viele Grüße,

Sukka

Antworten