Site Index - Feedback - Impressum |
| |||||||||
|
|
( Archiv ) | ( Neues Thema ) |
04.05.2000 |
Wie baut man mit (p)gcc DLL"s, die mit Java funktionieren??? (von: Ronald Joseph, 00:00:00) | ^ » |
Hallo zusammen,
diese Frage lief schon mal unter dem Titel "Wie erstellt man JNI-DLL"s mit gcc (emx0.9 oder pgcc)??" und hat fuer mich leider nicht den gewuenschten Erfolg gebracht. Deshalb ein zweiter Anlauf, auch in der Hoffung, das mir C-Programmier jetzt vielleicht besser helfen koennen. Es geht um die Frage, wie kann man mit (p)gcc eine DLL erstellen, die mir den Zugriff auf Systemfunktionen unter OS/2 erlaubt. Zur Theorie: Innerhalb der Java-Klasse werden hierfuer Methode als native deklariert. Anschliessend wird die Kasse mit javac uebersetzt und raus kommt ein .class. Jetzt wird mit Hilfe des Tools javah ein Header-File erzeugt. Dieses wird dann in das C-Programm includiert/importiert und das ganze zu einer DLL "verwurstet". So weit zur Theorie; nun zur Praxis. Die Header-Files von Java (insbesondere jni_md.h) sind fuer VAC gemacht. Also habe ich mich hingesetzt und versucht fuer den (p)gcc passende #defines erstellt. Dabei habe ich nur das File jni_md.h geaendert (<javahome>includeos2). Der Compiler macht dann daraus auch eine DLL, doch leider stuerzt nach dem Aufruf der native-Methode die JVM mit einem SYS3175 in javax.dll ab. Damit es nicht bei Trockenuebungen bleibt hier, die notwendigen Dateien: <javahome>includeos2jni_md.h wurde wie folgt geaendert: #if !defined OS2 /*ibm*/ #define OS2 1 #endif /*ibm*/ #if defined OS2 /*ibm*/ /* #define JNIEXPORT change to JNIEXPORT0 by rojo 17.04.2000 */ #define JNIEXPORT0 /* #define JNICALL0 change to JNICALL00 by rojo 17.04.2000 */ #define JNICALL00 _System #ifndef JAVA_EXE /* Keine Java-Exe => also DLL */ /* rojo 17.04.2000 */ /* #define JNICALL _Export JNICALL0 */ /* rojo 17.04.2000 */ #define JMS_TRL 1 #define JIT_TRL 1 #define JIT_WAY 1 #ifdef __EMX__ /* rojo 17.04.2000 */ #define JNICALL __attribute__((__stdcall__)) #endif #else #define JNICALL JNICALL0 #endif #ifdef __EMX__ /* rojo 17.04.2000 */ #define JNIEXPORT /*__declspec(dllexport)*/ #define PJNICALL JNICALL * #define JNICALL0 JNICALL * #else /* rojo 17.04.2000 */ #define JNICALL0 JNICALL00 #define JNIEXPORT JNIEXPORT0 #define JNICALL _Export JNICALL0 #define PJNICALL * JNICALL0 #endif #else /*ibm*/ #define JNIEXPORT __declspec(dllexport) #define JNICALL __stdcall #define PJNICALL JNICALL * #endif /*ibm*/ ---ENDE Aenderungen jni_md.h--- Die Datei javatest.java: // package // import public class jnitest { public static void main (String args[]) { new jnitest ().run (); } public void run () { System.loadLibrary ("jnitest"); System.out.println ("before native-Methode..."); test (); System.out.println ("...after"); System.exit (0); } public native void test (); } ---ENDE jnitest.java---- Der Aufruf von javah und das Ergebnis jnitest.h: javah -jni jnitest /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class jnitest */ #ifndef _Included_jnitest #define _Included_jnitest #ifdef __cplusplus extern "C" { #endif /* * Class: jnitest * Method: test * Signature: ()V */ JNIEXPORT void JNICALL Java_jnitest_test (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif ---ENDE jnitest.h--- Das C-Programm jnitest.c: #include <jnitest.h> JNIEXPORT void JNICALL Java_jnitest_test (JNIEnv * env, jobject obj) { int x = 23 + 25; printf ("hallo welt"); } ---ENDE jnitest.c--- Das def-File jnitest-2.def: LIBRARY jnitest INITINSTANCE DESCRIPTION "JNI-Test-DLL" DATA MULTIPLE NONSHARED CODE SHARED EXPORTS "Java_jnitest_test" ---ENDE jnitest-2.def--- Der Aufruf von gcc (laesst sich auch in einem Ritt machen): gcc -Zomf -Zdll -Zno-rte -Id:java11include -Id:java11includeos2 -I. -c jnitest.c gcc -Zomf -Zdll -Zno-rte -o jnitest.dll jnitest-2.def jnitest.o Meine Fragen nun: 1. Kann es sein, das noch ein Fehler in dem geaenderten Header-File ist? Das native-Interface von Java benutzt als Aufrufkonvention Pascal. 2. Ist es weiterhin moeglich (vielleicht auch wegen Punkt 1.), das der Aufrufstack am Ende der Methode nicht aufgeraeumt wird? 3. Fehlt vielleicht noch irgendwelcher Code innerhalb des C-Programms fuer Initialisierungen oder aehnliches? 4. Kann jemand eine Art Kochbuch machen? Also ein Template fuer eigene C-Programme und einen CMD-Script oder make-File, wie das zu uebersetzen ist? Ich habe keine grosse Erfahrung mit C/C++ und Compilern und deren Eigenheiten; ich moechte es einfach nur benutzen koennen. Gruss und Hoffungsvoll/2 Ronald [ Leser: 52 ] |
|
Mit * markierte Felder müssen ausgefüllt werden ! |
( Zeige alle Einträge ) | ( Zur Startübersicht ) |
|
| Ronald Joseph | 52 | 04.05.2000 | 00:00 |
| 49 | 04.05.2000 | 00:00 |
| Ronald Joseph | 46 | 04.05.2000 | 00:00 |
|