OS2.org Site Index - Feedback - Impressum
Sprachauswahl / Choose your Language News Software Hardware Projekte Forum Tipps Links Verschiedenes
Editorial Diskussion HelpDesk Umfrage
[Forum]
in nach (Erweiterte Suche)
[Forum]
( 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 ]

Datum Thema
07.01.2017 *

*

Name: * eMail: Benachrichtigung

Mit * markierte Felder müssen ausgefüllt werden !

( Zeige alle Einträge ) ( Zur Startübersicht )
Thema von: Leser Datum Zeit
 Wie baut man mit (p)gcc DLL"s, die mit Java funktionieren???
Ronald Joseph5204.05.200000:00
 Nachfrage

4904.05.200000:00
 Re: Nachfrage
Ronald Joseph4604.05.200000:00


php.net OpenIT © 1998-2017 by WebTeam OS2.org