JNI und packages

SOSUS

Grünschnabel
Hallo!

Bin zur Zeit am Rumprobieren mit dem JNI.
Dabei ist mir aufgefallen, dass man nicht ohne weiteres mit Packages arbeiten kann.
Spezieller gesagt.... es geht schon, aber nur unter Verwendung der Methode

System.load("pfad\\hello.dll"); und nicht mit der System.loadLibrary(hello);

Bei Verwendung der letzteren bekomme ich immer einen Fehler
UnsatisfiedLinkError

Dabei wird die native Methode die gerufen wird nicht gefunden.
Die Headerdatei und die Bibliothek habe ich entsprechend angepasst (JAVA_package_...)

Ist das schonmal jemandem aufgefallen oder kennt jemand eine andere Lösung?
 
Hallo!

System.loadLibrary(...) läd nur Bibliotheken die dem System bzw. der Java Laufzeit "bekannt" sind. Also beispielse in Winnt\System32\ und ähnlichen Ordnern (jre\bin,...,) des Standard Libary Pfades liegen.
Mit System.load(...) hingegen kannst du Dlls aus beliebigen Quellen laden.

Gruß Tom
 
Hallo!

das Problem besteht ja nicht darin dass die DLL nicht gefunden wird, sondern
nur eine Methode unbekannt ist aufgrund der Package - Deklaration.
Ich denke mal da würde es auch nicht gehen wenn ich bspw die DLL in einen
dieser Ordner kopiere!?

Bzw. kann man sagen dass Bibliotheken die man mit loadLibrary laden möchte
intern nicht auf Packages verweisen dürfen?
 
Zuletzt bearbeitet:
Hallo,
das Thema ist zwar schon sehr alt, aber meine Frage passt glaub ich auch hier hin ;-)
Ich habe genau das umgekehrte Problem: Ich möchte von C++ auf Java zugreifen. Dies funktioniert solange super bis ich in Java eigene Packages einbinde und deren Klassen/Methoden aufrufe. Die Packages liegen in einem anderen Ordner als die Javaklasse, die ich per JNI aufrufe, ich weiß aber nicht ob oder wo ich diesen Ort angeben müsste.
Hier mein C++ Code:
Code:
	JNIEnv			*env;
        JavaVM			*jvm;
	JavaVMInitArgs	args;
	JavaVMOption	options[1];
	int				arrSize;
	signed char		*png;
	CreateJavaVM_t	*CreateJavaVM;
	HINSTANCE		handle;
		
	if ((handle = LoadLibrary("C:\\Programme\\Java\\jdk1.5.0_07\\jre\\bin\\client\\jvm.dll")) == NULL)
	{
		printf("Error:cannot loading JVM\n");
		return FALSE;
	}

	CreateJavaVM = (CreateJavaVM_t *)GetProcAddress(handle, "JNI_CreateJavaVM");
	if (CreateJavaVM == NULL)
	{
		printf("Error: can't find JNI interfaces\n");
		return FALSE;
	}

	args.version = JNI_VERSION_1_4;
	args.nOptions = 1;

	options[0].optionString ="-Djava.class.path=C:/workspace";
	args.options = options;
	args.ignoreUnrecognized = JNI_FALSE;
	if(CreateJavaVM(&jvm, (void **)&env, &args) != 0)
	{
		printf("Error: cannot create JVM\n");
		return FALSE;
	}

    jclass cls = env->FindClass(javaClassname.c_str());
    if (cls == 0) {
		jvm->DestroyJavaVM();
		return FALSE;
    }
Sobald ich mein Package in der Java-Klasse verwende ist cls==0.
Hat jemand einen Tipp für mich?
 
Zurück