Zonbléou Geschrieben 26. März 2009 Teilen Geschrieben 26. März 2009 Hallo Leute, jetzt bin ich einbischen überfordert und bitte ich deswegen um eure Hilfe. Ich arbeite mit Eclipse cdt, MinGW und MSYS. CDT für C/C++ Umgebung, MinGW für GNU(c und c++ Compiler unter Windows). MSYS nur um einige Funktionalitäten von LINUX benutzen zu können. Für ein Projekt wurde eine Software in C geschrieben und es gibt auch die DLL für C die zur Verfügung stehen. Ich habe außerdem ein paar Header Dateien die Funktionsprototypen enthalten. Mittlerweile habe ich auch ein Toll installiert(Dependency Walker) um die DLL Funktionen lesen zu können. Jetzt meine Aufgabe ist einigen Methoden aus C-DLL für eine Berechnung aufzurufen. Ich habe dafür diese Methoden als native Methoden in meiner Java Programm deklariert: package triangleberechner; public class Triangulationsberechnung { static{ System.loadLibrary("libDMASCProg"); } public static void main(String[] args) { int drob = 1; int dobj = 1; String initial = "null"; boolean rohdatenzeile = true; boolean zeit = true; byte[] input64 = new byte[32]; try{ System.out.println("Ausführung von java Programm mit nativen Methoden!!!"); Triangulationsberechnung triangle = new Triangulationsberechnung(); triangle._mcbe_InitBerechnung_setDebugOptions(drob, dobj, initial, rohdatenzeile, zeit); triangle._mcbe_RechneMitZeile(input64); } catch(UnsatisfiedLinkError ex){ ex.printStackTrace(); System.out.println("Message:" + ex.getMessage()); System.out.println("CRASHBOOMBANG!!!"); } } public native <AnsiString> void _mcbe_InitBerechnung_setDebugOptions(int bitmask_chkbox_drob, int bitmask_chkbox_dobj, AnsiString filter_text, boolean chkbox_n_rohdatenzeile, boolean chkbox_zeit); // (struct mcb_dbgopt_S o) public native void _mcbe_RechneMitZeile(byte[] input64); //(unsigned char * input64) } Aus diesem Java Programm könnte ich meine Header Datei für C erstellen: /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class triangleberechner_Triangulationsberechnung */ #ifndef _Included_triangleberechner_Triangulationsberechnung #define _Included_triangleberechner_Triangulationsberechnung #ifdef __cplusplus extern "C" { #endif /* * Class: triangleberechner_Triangulationsberechnung * Method: _mcbe_InitBerechnung_setDebugOptions * Signature: (IIZZ)V */ JNIEXPORT void JNICALL Java_triangleberechner_Triangulationsberechnung__1mcbe_1InitBerechnung_1setDebugOptions (JNIEnv *, jobject, jint, jint, jobject, jboolean, jboolean); /* * Class: triangleberechner_Triangulationsberechnung * Method: _mcbe_RechneMitZeile * Signature: ([B)V */ JNIEXPORT void JNICALL Java_triangleberechner_Triangulationsberechnung__1mcbe_1RechneMitZeile (JNIEnv *, jobject, jbyteArray); #ifdef __cplusplus } #endif #endif Bzw. meine Wrapper C Datei schreiben, obwohl die nicht ganz fertig geschrieben. /* * Triangleberechner.c * * Created on: 17.03.2009 * Author: SBX825 */ #include <jni.h> #include "triangleberechner_Triangulationsberechnung.h" #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> //#include <d_cal12.h> //#include <cpp_asrt.h> //#include <d_calopt.h> //#include <d_calpdf.h> //#include <dyn_d_cal12.h> //#include <tmp_pdf.h> JNIEXPORT void JNICALL Java_triangleberechner_Triangulationsberechnung__1mcbe_1InitBerechnung_1setDebugOptions (JNIEnv *env, jobject obj, jint in_int1, jint in_int2, jstring in_str, jboolean in_bool1, jboolean in_bool2) { char buf[128]; // Java String in C-String konvertieren und an C-Variablen zuweisen const char *c_string = (*env)->GetStringUTFChars(env, in_str, 0); printf("%d %d %s %d %d\n", in_int1, in_int2, c_string, in_bool1, in_bool2); //_mcbe_InitBerechnung_setDebugOptions(in_int1, in_int2, c_string, in_bool1, in_bool2); //struct mcbe_dbgopt_S o strcpy (buf, c_string); strcat(buf, "Greeting from C!"); (*env)->ReleaseStringUTFChars(env, in_str, c_string); return ;//(*env)->NewStringUTF(env, buf); } JNIEXPORT void JNICALL Java_triangleberechner_Triangulationsberechnung__1mcbe_1RechneMitZeile (JNIEnv *env, jobject obj, jbyteArray jarr) { // Der Array muss mit seiner Länge übernommen werden //jsize l = (*env)->GetArrayLength(env, jarr); jbyte *input64 = (*env)->GetByteArrayElements(env, jarr, 0); /*Aufruf der Methode mcbe_1RechneMitZeile in der Bibliothek Triangulationsberechnung.dll * dieses C-File muß in der gleichen Bibliothek zur Verfügung stehen. * */ //jarr = (*env)->_mcbe_1RechneMitZeile(input64); //jarr = (*env)->_mcbe_RechneMitZeile(input64); // Speicher freigeben und rückkopieren des Arrays (*env)->ReleaseByteArrayElements(env, jarr, input64, 0); } Anschließend habe ich auch mein DLL für java der den Zugriff auf ermöglichen kann erstellt. Den habe ich ich auch in meiner java klasse geladen und das funktioniert denn über printf() könnte ich ein Output in der Konsol lesen. Alle Dll und Header von C sind auch unter Eclipse eingebunden. Aber mein Ziel ist das zu bekommen was in dem Rumpf von C-Methoden implementiert ist. Meine Frage jetzt ist wie mache ich die Aufrufe von benötigen Methoden aus C-Dll? Wo paasiert das und was brauche ich dafür? Brauche ich eigentlich die C-Header in meiner C-Wrapper zu inkludieren? Ich hoffe wirklich auf eure Hilfe. Vielen Dank im voraus. Zonbléou Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
VaNaTiC Geschrieben 27. März 2009 Teilen Geschrieben 27. März 2009 Mittels JNI habe ich schon diverse C++ Funktionalitäten eingebunden, aber ich verstehe leider Deine Fragen nicht. Könntest Du bitte die Fragen etwas verallgemeinern, denn mir fehlt das tatsächliche Problem? Oder geht es um das prinzipielle Handling von JNI, dann ist das aber viel zu viel Text Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Zonbléou Geschrieben 27. März 2009 Autor Teilen Geschrieben 27. März 2009 Hallo, klar ich weiss, dass es keinen Spaß macht das ganze zu lesen. Aber ich wollte das ganze deutlich darstellen damit man versteht was ich so tue. Ich versuche jetzt mein problem ganz allgemein zu beschreiben. Ich will das ganze so bauen, dass ich das statisch linke. Ich habe die C-DLLs und die Header, die zum Erzeugen von diese DLLs gebraucht worden. Ich habe schon meine JNIDLL erzeugt. Wie kann ich das ganze zusammen bringen, dass die Funktionen aus C-DLLs benutzt werden? Vielen Dak nochmal für Deine Mühe meine Fragen zu verstehen. Zonbléou Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 27. März 2009 Teilen Geschrieben 27. März 2009 Du musst in der JNI-DLL die C-DLL laden (LoadLibrary) und dann die Funktionsadressen der benötigten Funktionen auslesen (GetProcAddress). Darüber kannst du die Funktionen dann aufrufen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Zonbléou Geschrieben 27. März 2009 Autor Teilen Geschrieben 27. März 2009 Hallo, zum Glück bist Du noch Online und vielleicht hast Du noch bischen Zeit. Ich habe das hier versucht: JNIEXPORT void JNICALL Java_triangleberechner_Triangulationsberechnung__1mcbe_1RechneMitZeile (JNIEnv *env, jobject obj, jbyteArray jarr) { jint HINSTANCE; // Der Array muss mit seiner Länge übernommen werden //jsize l = (*env)->GetArrayLength(env, jarr); jbyte *input64 = (*env)->GetByteArrayElements(env, jarr, 0); /*Aufruf der Methode mcbe_1RechneMitZeile in der Bibliothek Triangulationsberechnung.dll * dieses C-File muß in der gleichen Bibliothek zur Verfügung stehen. * */ LoadLibrary("d_cal12.DLL"); // Speicher freigeben und rückkopieren des Arrays (*env)->ReleaseByteArrayElements(env, jarr, input64, 0); } und ich kriege so was als fehlermeldung: (.text+0x117): undefined reference to `_LoadLibrary' collect2: ld returned 1 exit status kannst Du mir dann dabei helfen wie ich diese Loadlibrary(), benutzte und getAdresse Methoden? Vielen Dank nochmal. Zonbléou Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 27. März 2009 Teilen Geschrieben 27. März 2009 Die Funktionen sind in Kernel32.dll definiert. Du musst also zu deiner JNI-DLL kernel32.lib dazulinken. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Zonbléou Geschrieben 27. März 2009 Autor Teilen Geschrieben 27. März 2009 Oh! Sorry! ich komme damit noch nicht klar. soll ich wie die andere C-DLL und Header unter GCC C Compiler den Pfad zu dem Lib geben und unter MinGW Linker die kernel32Dll laden? Oder geht das über meine C-Wrapper? Danke Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Zonbléou Geschrieben 27. März 2009 Autor Teilen Geschrieben 27. März 2009 Hallo nochmal, ich habe den Pfad von kernel32 gesucht und das verlinken über MinGw wie vorher beschrieben versucht und ich kriege so was als Fehlermeldung: Warning: resolving _Java_triangleberechner_Triangulationsberechnung__1mcbe_1RechneMitZeile by linking to _Java_triangleberechner_Triangulationsberechnung__1mcbe_1RechneMitZeile@12 src\Triangleberechner.o:Triangleberechner.c:(.text+0x117): undefined reference to `_LoadLibrary' C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/libgcc.a(w32-shared-ptr.o).text+0x31): undefined reference to `__imp__GetAtomNameA@12' C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/libgcc.a(w32-shared-ptr.o).text+0x159): undefined reference to `__imp__FindAtomA@4' C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/libgcc.a(w32-shared-ptr.o).text+0x2b1): undefined reference to `__imp__AddAtomA@4' C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/libgcc.a(w32-shared-ptr.o).text+0x2d2): undefined reference to `__imp__FindAtomA@4' collect2: ld returned 1 exit status Build error occurred, build is stopped[/code] Gibt eine Möglichkeit weiter zu helfen? Grüße. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 27. März 2009 Teilen Geschrieben 27. März 2009 Hallo nochmal, ich habe den Pfad von kernel32 gesucht und das verlinken über MinGw wie vorher beschrieben versucht und ich kriege so was als Fehlermeldung:Entweder hast du nicht beschrieben, wie du kernel32.lib gelinkt hast, oder ich finde diese Beschreibung nicht. Wie auch immer, du hast es offenbar falsch gemacht, denn die Linkerfehler verweisen ausnahmslos auf Funktionen aus kernel32.dll. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Zonbléou Geschrieben 27. März 2009 Autor Teilen Geschrieben 27. März 2009 Ich weiss nicht genau wie ich das richtig machen kann. Ich arbeite mit eclipse cdt und MinGW. Unter Project -> Properties -> C/C++Builder -> Settings habe und dann MinGW C Linker -> Libraries habe ich unter Libraries(-l) kernel32 eingefügt und unter Libraries search path(-L) habe ich C:\WINDOWS\system32 und dann C:\WINDOWS\W32api eingefügt. Ich weiss, dass es falsch sein kann aber nur so kann man mir helfen. Danke nochmal. Zonbléou Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Zonbléou Geschrieben 30. März 2009 Autor Teilen Geschrieben 30. März 2009 Guten morgen Herren, ich hoffe störe gerade nicht. Ich habe am Freitag versucht zu beschreiben wie ich mein kernel32.dll und kernel32.lib eingefügt habe. Ich hoffe das kann man verstehen. Wenn Sie bischen Zeit haben, schauen Sie, ob Sie mir weiter helfen können. Da bin ich gerade blockiert. Vielen Dank. Zonbléou Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 30. März 2009 Teilen Geschrieben 30. März 2009 Du brauchst den Pfad zur Lib, nicht zur DLL. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Zonbléou Geschrieben 30. März 2009 Autor Teilen Geschrieben 30. März 2009 Hallo, ich habe es immer noch nicht richtig. Die libkernel32.a die ich gefunden habe bezieht sich auf dem MinGW. Ich weiss nicht, ob ich da richtig bin. Außerdem ich denke da brauche irgendeine .a lib von meiner JNI-DLL. Könnten Sie mir bei diesen Begriffe helfen? In meinem MinGW C Linker -> hared Library Settings unter dem Eclipse habe ich folgende Begriffe gefunden und ich weiss nicht auf welchen DLL sie sich beziehen; auf meine erzeugte JNI-DLL oder auf die C-DLL? - Shared object name, -Import Library name, und -DEF file name. Bitte um Hilfe, bin Anfänger. Danke. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 30. März 2009 Teilen Geschrieben 30. März 2009 ich habe es immer noch nicht richtig.Dieselben Fehler, oder andere? Die libkernel32.a die ich gefunden habe bezieht sich auf dem MinGW.Ja und? Das ist in Ordnung. Außerdem ich denke da brauche irgendeine .a lib von meiner JNI-DLL. Nein, soweit ich weiß, nicht. In meinem MinGW C Linker -> hared Library Settings unter dem Eclipse habe ich folgende Begriffe gefunden und ich weiss nicht auf welchen DLL sie sich beziehen; auf meine erzeugte JNI-DLL oder auf die C-DLL? - Shared object name, -Import Library name, und -DEF file name.Da ich davon ausgehen, dass du die C-DLL nicht selbst erstellst, handelt es sich um die JNI-DLL. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Zonbléou Geschrieben 30. März 2009 Autor Teilen Geschrieben 30. März 2009 Hi, am Anfang sehen Sie die libs und dll die ich eingefügt habe und dann die fehlermeldungen am Ende. **** Build of configuration Release for project DMASCProg **** **** Internal Builder is used for build **** gcc ../src/Triangleberechner.def -LC:\Dokumente und Einstellungen\SBX825\Desktop\Rohdata -LC:\MinGW\lib -shared -Wl,-soname=libDMASCProg -Wl,--out-implib=libDMASCProg -Wl,--output-def=Triangleberechner -olibDMASCProg.dll src\Triangleberechner.o -ld_caldbg -lborlndmm -lcc3260 -lcc3260mt -lstlp45 -ld_cal12 -lvcand32 -lDetSys_001 Creating library file: libDMASCProg Warning: resolving _Java_triangleberechner_Triangulationsberechnung__1mcbe_1InitBerechnung_1setDebugOptions by linking to _Java_triangleberechner_Triangulationsberechnung__1mcbe_1InitBerechnung_1setDebugOptions@28 Use --enable-stdcall-fixup to disable these warnings Use --disable-stdcall-fixup to disable these fixups Warning: resolving _Java_triangleberechner_Triangulationsberechnung__1mcbe_1RechneMitZeile by linking to _Java_triangleberechner_Triangulationsberechnung__1mcbe_1RechneMitZeile@12 src\Triangleberechner.o:Triangleberechner.c:(.text+0x117): undefined reference to `_LoadLibrary' src\Triangleberechner.o:Triangleberechner.c:(.text+0x123): undefined reference to `_LoadLibrary' src\Triangleberechner.o:Triangleberechner.c:(.text+0x12f): undefined reference to `_LoadLibrary' src\Triangleberechner.o:Triangleberechner.c:(.text+0x137): undefined reference to `__mcbe_1RechneMitZeile' collect2: ld returned 1 exit status Build error occurred, build is stopped Time consumed: 375 ms. Ich lese auch gerade die FAQ von MinGW aber hilft mir nicht so viel. Vielleicht kriege ich das irgendwann und habe ich auch viel gelernt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 30. März 2009 Teilen Geschrieben 30. März 2009 am Anfang sehen Sie die libs und dll die ich eingefügt habeDa ist aber von kernel32 nichts zu sehen. LoadLibrary ist auch in Kernel32.dll. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Zonbléou Geschrieben 30. März 2009 Autor Teilen Geschrieben 30. März 2009 Hallo, was mache ich jetzt falsch? Ich bin erschöpft. Sollte ich irgendwas in dieser Methode als Rumpf implementieren? Falls ja, können Sie mir ein Bsp. geben? Jesdes Mal, wenn ich versuche "LoadLabrary()" aufzurufen oder eine Methode aus der C-DLL zum Bsp. "_mcbe_RechneMitZeile(parameter)" aufzurufen, ich kriege immer dieser undefined reference to '_LoadLibrary' Fehlermeldung. Ohne irgendeinen Aufruf compilier Fehlerfrei. Ich weiss nicht was ich machen soll. Bitte um Bsp. Z. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 30. März 2009 Teilen Geschrieben 30. März 2009 Jesdes Mal, wenn ich versuche "LoadLabrary()" aufzurufen oder eine Methode aus der C-DLL zum Bsp. "_mcbe_RechneMitZeile(parameter)" aufzurufen, ich kriege immer dieser undefined reference to '_LoadLibrary' Fehlermeldung.Dann hast du die Importbibliothek für kernel32.dll immer noch nicht richtig dazugelinkt. Die Funktionen aus der C-DLL wirst du sowieso nicht direkt aufrufen können, weil du für diese DLL keine Importbibliothek hast. Du musst dir mit LoadLibrary/GetProcAddress die Funktionszeiger aus der DLL holen und diese aufrufen. Ohne irgendeinen Aufruf compilier Fehlerfrei.Logisch. Wenn du keine Funktionen aus kernel32.dll benutzt, brauchst du sie auch nicht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Zonbléou Geschrieben 30. März 2009 Autor Teilen Geschrieben 30. März 2009 Hallo noch einmal, ich störe jetzt schon zu viel aber entschuldigen Sie. Ich habe nach dem Beispiel von jemandem aus Internet es so gemacht: projects->properties->C/C++Build->Settings->Tool Settings->MinGW C++ Linker-->Miscellaneous->Other Objects und neuen adden mit dem link "C:\MinGW\lib\libkernel32.a" . und dan unter lib Im -> Settings->Directory den Namen von kernel32.dll eingefügt. Können Sie mir bei der Deklaration von LoadLibrary() und GetProcAdress() helfen indem Sie mir ein Bsp. geben? Die Bsp. aus Internet sind mit irgend INSTANCE Variablen gebaut und ich komme nicht klar damit. Vielen Dank im voraus. Z. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Zonbléou Geschrieben 31. März 2009 Autor Teilen Geschrieben 31. März 2009 Hallo Herren, wie Sie merken, Sie sind der einzige der mir bei dem Thema helfen können. Mein letzter Einbinden von kernel32.dll und libkernel32.a scheint funktioniert zu haben. Außerdem musste ich noch "windows.h" inkludieren. Meine LoadLibrary/GetProcAddress habe ich wie folgt implementiert: typedef void (*FNPTR)(char*); typedef jbyte (*pFunc) (jbyte input64) HINSTANCE hIns; pFunc pFn; jbyte input64[] = {2,4}; hIns = LoadLibrary("d_cal12.DLL"); if(hIns) { pFn = (pFunc)GetProcAddress(hIns,"_mcbe_RechneMitZeile"); FreeLibrary(hIns); } system("PAUSE"); Es gibt keine Reference Beschwerden mehr. Meine .a, .def Dateien wurden erzeugt. Im .def-Datei kann man alle exports Funktionen von meinem JNI-DLL und Import C-DLL und deren Funktionen sehen. Meine Frage; es bedingt noch Aufrufe von C-DLL Methoden im meinem Wrapper-Datei? Wie sehe ich die endgültige Ergebnisse oder ob der Aufruf funktioniert hat? Vielleicht die letzte Störung. Danke für Deine Gedult. Ich gebe noch die Implementierung einer Methode mit und zeigen Sie mir das was fehlt. JNIEXPORT void JNICALL Java_triangleberechner_Triangulationsberechnung__1mcbe_1RechneMitZeile (JNIEnv *env, jobject obj, jbyteArray jarr) { HINSTANCE hIns; pFunc pFn; jbyte input64[] = {2,4}; hIns = LoadLibrary("d_cal12.DLL"); if(hIns) { pFn = (pFunc)GetProcAddress(hIns,"_mcbe_RechneMitZeile"); FreeLibrary(hIns); } system("PAUSE"); // Speicher freigeben und rückkopieren des Arrays (*env)->ReleaseByteArrayElements(env, jarr, input64, 0); } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Zonbléou Geschrieben 31. März 2009 Autor Teilen Geschrieben 31. März 2009 Mittels JNI habe ich schon diverse C++ Funktionalitäten eingebunden, aber ich verstehe leider Deine Fragen nicht. Könntest Du bitte die Fragen etwas verallgemeinern, denn mir fehlt das tatsächliche Problem? Oder geht es um das prinzipielle Handling von JNI, dann ist das aber viel zu viel Text Mein letzter Einbinden von kernel32.dll und libkernel32.a scheint funktioniert zu haben. Außerdem musste ich noch "windows.h" inkludieren. Meine LoadLibrary/GetProcAddress habe ich wie folgt implementiert: typedef void (*FNPTR)(char*); typedef jbyte (*pFunc) (jbyte input64) HINSTANCE hIns; pFunc pFn; jbyte input64[] = {2,4}; hIns = LoadLibrary("d_cal12.DLL"); if(hIns) { pFn = (pFunc)GetProcAddress(hIns,"_mcbe_RechneMitZeile") ; FreeLibrary(hIns); } system("PAUSE"); Es gibt keine Reference Beschwerden mehr. Meine .a, .def Dateien wurden erzeugt. Im .def-Datei kann man alle exports Funktionen von meinem JNI-DLL und Import C-DLL und deren Funktionen sehen. Meine Frage; es bedingt noch Aufrufe von C-DLL Methoden im meinem Wrapper-Datei? Wie sehe ich die endgültige Ergebnisse oder ob der Aufruf funktioniert hat? Vielleicht die letzte Störung. Danke für Deine Gedult. Ich gebe noch die Implementierung einer Methode mit und zeigen Sie mir das was fehlt. JNIEXPORT void JNICALL Java_triangleberechner_Triangulationsberechnung__1 mcbe_1RechneMitZeile (JNIEnv *env, jobject obj, jbyteArray jarr) { HINSTANCE hIns; pFunc pFn; jbyte input64[] = {2,4}; hIns = LoadLibrary("d_cal12.DLL"); if(hIns) { pFn = (pFunc)GetProcAddress(hIns,"_mcbe_RechneMitZeile") ; FreeLibrary(hIns); } system("PAUSE"); // Speicher freigeben und rückkopieren des Arrays (*env)->ReleaseByteArrayElements(env, jarr, input64, 0); } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 31. März 2009 Teilen Geschrieben 31. März 2009 Zwischen GetProcAddress und FreeLibrary fehlt der Aufruf der Funktion. Der Funktionszeigertyp pFunc muss auf die Signatur der Funktion passen. Die sollte ja aus der Headerdatei der C-DLL hervorgehen. Ich glaube nicht, dass der richtig ist, denn eine C-Funktion dürfte kaum jbyte als Parameter- oder Rückgabetyp haben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Zonbléou Geschrieben 31. März 2009 Autor Teilen Geschrieben 31. März 2009 Ich bin auch ganz neu zu C und weiss deswegen nicht wie ich das richtig programmieren kann. Wegen Der Funktionszeigertyp pFunc; wie mache ich das? So heisst die Funktion im Header: extern "C" void DLL_EXP mcbe_RechneMitZeile(unsigned char * input64); Wenn ich der Aufruf von "mcbe_RechneMitZeile(char* input64)" versuche dann kriege eine Fehlermeldung, daß die Structure ist nicht enthalten. Naja sicher funktioniert das irgendwie!! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 31. März 2009 Teilen Geschrieben 31. März 2009 Wegen Der Funktionszeigertyp pFunc; wie mache ich das?So: typedef void(*pFunc)(unsigned char*); Wenn ich der Aufruf von "mcbe_RechneMitZeile(char* input64)" versuche dann kriege eine Fehlermeldung, daß die Structure ist nicht enthalten.mcbe_RechneMitZeile ist ja auch kein gültiger Bezeichner an dieser Stelle. Du musst die Funktion über den Funktionszeiger aufrufen. Das könnte so aussehen: pFunc( input64 ); Das heißt, falls das Array input64 als Parameter für diese Funktion gedacht ist. jbyte könnte auf unsigned char passen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Zonbléou Geschrieben 31. März 2009 Autor Teilen Geschrieben 31. März 2009 Hi, Danke für die Ergänzung. gibt es eine Möglichkeit zu prüfen, ob meine Methoden aufgerufen sind oder nicht? Danke Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.