Lt.Henry
25-08-2006, 11:25
Hallo
Um mein Problem besser zu veranschaulichen hole ich etwas weiter aus.
Eine Java-Anwendung arbeitet Hand in Hand mit Cobol-DLLs. Da Java die Cobol-DLLs nicht direkt aufrufen kann, gibt es eine in C geschriebene Wrapper-DLL die das erledigt. Unter Windows alles kein Problem. Doch nun soll das komplette Projekt unter Linux laufen. Hier gibt es nun Probleme bei der Wrapper Datei. Ich kann keine SO-Datei erstellen. Der Fehler mit der windows.h ist mir klar. Aber warum hat er unter Linux Probleme mit dem anderen Code was unter Windows einwandfrei läuft?
Fehlermeldung:
StradaDialogTest.c:3:35: error: include/linux/windows.h: Datei oder Verzeichnis nicht gefunden
StradaDialogTest.c:7: Warnung: Parameternamen (ohne Typen) in Funktionsdeklaration
StradaDialogTest.c:10: Fehler: syntax error before »stradainst«
StradaDialogTest.c:10: Warnung: Initialisierung erzeugt Ganzzahl von Zeiger ohne Typkonvertierung
StradaDialogTest.c:10: Warnung: Datendefinition hat keinen Typ oder Speicherklasse
StradaDialogTest.c: In Funktion »Java_wam_StradaDialog_loadstrada«:
StradaDialogTest.c:20: Warnung: Vergleich zwischen Zeiger und Ganzzahl
StradaDialogTest.c:21: Fehler: »TRUE« nicht deklariert (erste Benutzung in dieser Funktion)
StradaDialogTest.c:21: Fehler: (Jeder nicht deklarierte Bezeichner wird nur einmal aufgeführt
StradaDialogTest.c:21: Fehler: für jede Funktion in der er auftritt.)
StradaDialogTest.c:30: Warnung: Zuweisung erzeugt Ganzzahl von Zeiger ohne Typkonvertierung
StradaDialogTest.c:31: Fehler: »FALSE« nicht deklariert (erste Benutzung in dieser Funktion)
StradaDialogTest.c: In Funktion »Java_wam_StradaDialog_cancelstrada«:
StradaDialogTest.c:42: Fehler: »FALSE« nicht deklariert (erste Benutzung in dieser Funktion)
StradaDialogTest.c:45: Warnung: Zuweisung erzeugt Ganzzahl von Zeiger ohne Typkonvertierung
StradaDialogTest.c:47: Fehler: »TRUE« nicht deklariert (erste Benutzung in dieser Funktion)
StradaDialogTest.c: In Funktion »Java_wam_StradaDialog_callstrada«:
StradaDialogTest.c:54: Fehler: »FALSE« nicht deklariert (erste Benutzung in dieser Funktion)
StradaDialogTest.c:64: Fehler: »TRUE« nicht deklariert (erste Benutzung in dieser Funktion)
Code:
StradaDialogTest.h
#include <jni.h>
JNIEXPORT jboolean JNICALL Java_wam_StradaDialog_loadstrada (JNIEnv *, jobject);
JNIEXPORT jboolean JNICALL Java_wam_StradaDialog_cancelstrada (JNIEnv *, jobject);
JNIEXPORT jboolean JNICALL Java_wam_StradaDialog_callstrada (JNIEnv *, jobject, jbyteArray);
StradaDialogTest.c
//wrapper fuer native aufruf von libSPHSTRADA.so
#include <windows.h>
#include <string.h>
#include "StradaDialogTest.h"
typedef void (*STRADAPROC)(LPCTSTR);
//instanz der *.so und funktionsadressen
HINSTANCE stradainst=NULL;
STRADAPROC stradaproc=NULL;
//uebergabe arrays
jbyte *stradaeinaus;
//libSPHSTRADA.so laden und funktionsadresse holen
JNIEXPORT jboolean JNICALL Java_wam_StradaDialog_loadstrada(JNIEnv *env,jobject obj)
{
if (stradainst != NULL) //damit beim evtl. mehrfachaufruf nicht mehrfach geladen wird
return TRUE;
stradainst=LoadLibrary("libSPHSTRADA.so");
if (stradainst)
{
stradaproc=(STRADAPROC)GetProcAddress(stradainst,"SPHSTRADA");
if (!stradaproc)
{
//*.so freigeben und zurck
FreeLibrary(stradainst);
stradainst=NULL;
return FALSE;
}
return TRUE;
}
return FALSE;
}
//libSPHSTRADA.so freigeben
JNIEXPORT jboolean JNICALL Java_wam_StradaDialog_cancelstrada(JNIEnv *env,jobject obj)
{
if (!stradainst)
return FALSE;
if (!FreeLibrary(stradainst))
return FALSE;
stradainst=NULL;
stradaproc=NULL;
return TRUE;
}
//libSPHSTRADA.so aufrufen
JNIEXPORT jboolean JNICALL Java_wam_StradaDialog_callstrada(JNIEnv *env,jobject obj,jbyteArray arr)
{
if (!stradaproc)
return FALSE;
//array elemente zuweisen
stradaeinaus=(*env)->GetByteArrayElements(env,arr,0);
if (!stradaeinaus) //action nur wenn kein nullzeiger
return FALSE;
//action
(stradaproc)(stradaeinaus);
//freigeben
(*env)->ReleaseByteArrayElements(env,arr,stradaeinaus,0);
//alles ok zurck
return TRUE;
}
Ich kompilliere wie folgt:
gcc -fPIC -c StradaDialogTest.c
gcc -shared -o libStradaDialogTest.so StradaDialogTest.o
Es wäre schön, wenn Ihr mir helfen könnt. :)
Melanie
Um mein Problem besser zu veranschaulichen hole ich etwas weiter aus.
Eine Java-Anwendung arbeitet Hand in Hand mit Cobol-DLLs. Da Java die Cobol-DLLs nicht direkt aufrufen kann, gibt es eine in C geschriebene Wrapper-DLL die das erledigt. Unter Windows alles kein Problem. Doch nun soll das komplette Projekt unter Linux laufen. Hier gibt es nun Probleme bei der Wrapper Datei. Ich kann keine SO-Datei erstellen. Der Fehler mit der windows.h ist mir klar. Aber warum hat er unter Linux Probleme mit dem anderen Code was unter Windows einwandfrei läuft?
Fehlermeldung:
StradaDialogTest.c:3:35: error: include/linux/windows.h: Datei oder Verzeichnis nicht gefunden
StradaDialogTest.c:7: Warnung: Parameternamen (ohne Typen) in Funktionsdeklaration
StradaDialogTest.c:10: Fehler: syntax error before »stradainst«
StradaDialogTest.c:10: Warnung: Initialisierung erzeugt Ganzzahl von Zeiger ohne Typkonvertierung
StradaDialogTest.c:10: Warnung: Datendefinition hat keinen Typ oder Speicherklasse
StradaDialogTest.c: In Funktion »Java_wam_StradaDialog_loadstrada«:
StradaDialogTest.c:20: Warnung: Vergleich zwischen Zeiger und Ganzzahl
StradaDialogTest.c:21: Fehler: »TRUE« nicht deklariert (erste Benutzung in dieser Funktion)
StradaDialogTest.c:21: Fehler: (Jeder nicht deklarierte Bezeichner wird nur einmal aufgeführt
StradaDialogTest.c:21: Fehler: für jede Funktion in der er auftritt.)
StradaDialogTest.c:30: Warnung: Zuweisung erzeugt Ganzzahl von Zeiger ohne Typkonvertierung
StradaDialogTest.c:31: Fehler: »FALSE« nicht deklariert (erste Benutzung in dieser Funktion)
StradaDialogTest.c: In Funktion »Java_wam_StradaDialog_cancelstrada«:
StradaDialogTest.c:42: Fehler: »FALSE« nicht deklariert (erste Benutzung in dieser Funktion)
StradaDialogTest.c:45: Warnung: Zuweisung erzeugt Ganzzahl von Zeiger ohne Typkonvertierung
StradaDialogTest.c:47: Fehler: »TRUE« nicht deklariert (erste Benutzung in dieser Funktion)
StradaDialogTest.c: In Funktion »Java_wam_StradaDialog_callstrada«:
StradaDialogTest.c:54: Fehler: »FALSE« nicht deklariert (erste Benutzung in dieser Funktion)
StradaDialogTest.c:64: Fehler: »TRUE« nicht deklariert (erste Benutzung in dieser Funktion)
Code:
StradaDialogTest.h
#include <jni.h>
JNIEXPORT jboolean JNICALL Java_wam_StradaDialog_loadstrada (JNIEnv *, jobject);
JNIEXPORT jboolean JNICALL Java_wam_StradaDialog_cancelstrada (JNIEnv *, jobject);
JNIEXPORT jboolean JNICALL Java_wam_StradaDialog_callstrada (JNIEnv *, jobject, jbyteArray);
StradaDialogTest.c
//wrapper fuer native aufruf von libSPHSTRADA.so
#include <windows.h>
#include <string.h>
#include "StradaDialogTest.h"
typedef void (*STRADAPROC)(LPCTSTR);
//instanz der *.so und funktionsadressen
HINSTANCE stradainst=NULL;
STRADAPROC stradaproc=NULL;
//uebergabe arrays
jbyte *stradaeinaus;
//libSPHSTRADA.so laden und funktionsadresse holen
JNIEXPORT jboolean JNICALL Java_wam_StradaDialog_loadstrada(JNIEnv *env,jobject obj)
{
if (stradainst != NULL) //damit beim evtl. mehrfachaufruf nicht mehrfach geladen wird
return TRUE;
stradainst=LoadLibrary("libSPHSTRADA.so");
if (stradainst)
{
stradaproc=(STRADAPROC)GetProcAddress(stradainst,"SPHSTRADA");
if (!stradaproc)
{
//*.so freigeben und zurck
FreeLibrary(stradainst);
stradainst=NULL;
return FALSE;
}
return TRUE;
}
return FALSE;
}
//libSPHSTRADA.so freigeben
JNIEXPORT jboolean JNICALL Java_wam_StradaDialog_cancelstrada(JNIEnv *env,jobject obj)
{
if (!stradainst)
return FALSE;
if (!FreeLibrary(stradainst))
return FALSE;
stradainst=NULL;
stradaproc=NULL;
return TRUE;
}
//libSPHSTRADA.so aufrufen
JNIEXPORT jboolean JNICALL Java_wam_StradaDialog_callstrada(JNIEnv *env,jobject obj,jbyteArray arr)
{
if (!stradaproc)
return FALSE;
//array elemente zuweisen
stradaeinaus=(*env)->GetByteArrayElements(env,arr,0);
if (!stradaeinaus) //action nur wenn kein nullzeiger
return FALSE;
//action
(stradaproc)(stradaeinaus);
//freigeben
(*env)->ReleaseByteArrayElements(env,arr,stradaeinaus,0);
//alles ok zurck
return TRUE;
}
Ich kompilliere wie folgt:
gcc -fPIC -c StradaDialogTest.c
gcc -shared -o libStradaDialogTest.so StradaDialogTest.o
Es wäre schön, wenn Ihr mir helfen könnt. :)
Melanie