JNI mit vorhandenen libs oder dlls verwenden

Status
Nicht offen für weitere Antworten.

mischer

Aktives Mitglied
Hi Leutz,

tschulliung wenn ich mich heute mal wieder etwas braun anstelle, aber ich hab das mit JNI noch nicht ganz geblickt. Ich möchte eine bestehende dll in Java nutzen und habe mir dazu das JNI etwas angeschaut.
Ich habe mir auch eine Klasse geschrieben, die aus meiner dll eine Methode benutzt.
Guckst du hier:
Code:
public class MyJniTest {
	static {
		System.loadLibrary("vxlapi");
	}
	
	public native int xlOpenDriver();
	
	public static void main(String args[])
	{
		System.out.println("Hello, world!");
	}
}
Daraus habe ich mir mit javah die .h-Datei erzeugt ... nur weiß ich jetzt nicht was ich weiter machen soll. ???:L

In den Tutorials wie z.B. hier wird dann die .c implementiert, aber ich will ja die bestehende dll nutzen und nicht neu in c implementierten.
Ich hab sogar die originale .h und 2 libs hier rumliegen, damit sollte es doch irgendwie möglich sein, dieses JNI-Dingens zum rennen zu bekommen oder etwa nicht?

Danke für Eure Mühe!

Gruß
mischer
 

mischer

Aktives Mitglied
Ahhhh - mal ein paar Minuten länger draufschauen lohnt sich doch. :oops:

Habs glaub ich gerade geblickt.
Ich muss noch n sch... Wrapper in c bauen, der die originalen Methoden der dll aufruft. Ich seh zwar noch nicht ganz kommen, wie ich das mache, aber zumindest weiß ich grundsätzlich worums geht.

Bin aber für angebotene Hilfe immernoch ganz Ohr.
 

mischer

Aktives Mitglied
Hi nochmal,

ich hab es jetzt hinbekommen eine Methode aus der dll auszuführen ... nur ... glaub ich nicht, dass es die sinnvollste, weil wahrscheinlich nicht gerade performanteste Art und Weise ist dies zu tun.

Aber schaut am Besten selbst, lacht und gebt mir anschließend bitte Tipps, wie ich das besser lösen kann :roll:

MyJniTest.h
Code:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class MyJniTest */

#ifndef _Included_MyJniTest
#define _Included_MyJniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     MyJniTest
 * Method:    xlOpenDriver
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_MyJniTest_xlOpenDriver
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

MyJniTest.c
Code:
#include <jni.h>
#include <windows.h>
#include <winbase.h>

#include "vxlapi.h"
#include "MyJniTest.h"

JNIEXPORT jint JNICALL Java_MyJniTest_xlOpenDriver
  (JNIEnv *env, jobject obj)
{
    HMODULE   hDll;

    hDll = LoadLibrary("vxlapi.dll");
    if(hDll==NULL)
        return 1;

    FARPROC xlOpenDriver = GetProcAddress(hDll,"xlOpenDriver");
	
    //Funktion benutzen
    HANDLE h = xlOpenDriver();

    FreeLibrary(hDll);
    return (jint)h;    
}

Ich will nämlich nicht nur einmal eine Methode ausführen sondern ständig, deshalb gefällt mir das mit dem dynmisch laden und wieder in die Tonne klopfen bei jedem Aufruf nicht. Obwohl vielleicht würde es ja auch gehen, die hDll global zu machen und erst bei xlCloseDriver (gibbets natürlich auch noch) wieder freizugeben.

MfG
mischer
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben