Hallo,
ich muss für eine DLL eine Jar Bibliothek erstellen um mit der DLL kommunizieren zu können.
Dazu verwende ich JNA (Falls es noch eine andere Möglichkeit gibt, bitte schreiben!).
Im ersten Ansatz habe ich die JNA.jar einfach meinem Projekt hinzugefügt und alles hat nach einigen Bit Indifferenzen funktioniert.
Im nächsten Ansatz wollte ich das ganze direkt mit dem SourceCode von JNA ausprobieren, aber das funktioniert nicht mehr so wie gewollt.
Dazu habe ich den Source von GitHub heruntergeladen und in mein Projekt geladen. Der erste Fehler war das im src Folder von JNA die jnidispatch.dll nicht vorhanden war, ich diese aber aus der jna.jar herauskopieren konnte, wobei ich denke das hier auch irgendwo der Fehler liegt, denn diese jnidispatch.dll liefert mir einen Fehler beim abfragen von sizeof(bool).
Anders formuliert:
In der Native.java in com/sun/jna/ wird im static Block folgendes durchgeführt:
Bei "BOOL_SIZE" läuft das ganze auf folgenden Fehler:
Also der oben dargestellte Codeabschnitt soll der mit jnidispatch.dll zusammenarbeiten und mittels Konstanten (TYPE_VOIDP, TYPE_LONG...) die tatsächliche Anzahl an Bytes für jenen Datentyp auslesen.
Um das ganze besser zu verstehen ist hier auch der SourceCode der DLL, welcher auch von JNA zur Verfügung gestellt wurde.
Was mir noch unerklärlich ist woher diese Konstante "com_sun_jna_Native_TYPE_BOOL" kommt, denn diese finde ich weder in der .c Datei noch in der .h Datei zu der DLL.
Kann mir nur erklären das das genau der Pfad ist an welcher auch die Native.java Datei in meinem Projekt liegt (com/sun/jna/Native.java/TYPE_BOOL). Für die anderen 4 Dateitypen funktioniert das ganze ja auch, nur bei TYPE_BOOL springt er in C (in der DLL) in den default Fall rein.
Danke & Grüße
Times
ich muss für eine DLL eine Jar Bibliothek erstellen um mit der DLL kommunizieren zu können.
Dazu verwende ich JNA (Falls es noch eine andere Möglichkeit gibt, bitte schreiben!).
Im ersten Ansatz habe ich die JNA.jar einfach meinem Projekt hinzugefügt und alles hat nach einigen Bit Indifferenzen funktioniert.
Im nächsten Ansatz wollte ich das ganze direkt mit dem SourceCode von JNA ausprobieren, aber das funktioniert nicht mehr so wie gewollt.
Dazu habe ich den Source von GitHub heruntergeladen und in mein Projekt geladen. Der erste Fehler war das im src Folder von JNA die jnidispatch.dll nicht vorhanden war, ich diese aber aus der jna.jar herauskopieren konnte, wobei ich denke das hier auch irgendwo der Fehler liegt, denn diese jnidispatch.dll liefert mir einen Fehler beim abfragen von sizeof(bool).
Anders formuliert:
In der Native.java in com/sun/jna/ wird im static Block folgendes durchgeführt:
Java:
loadNativeDispatchLibrary();
POINTER_SIZE = sizeof(TYPE_VOIDP);
LONG_SIZE = sizeof(TYPE_LONG);
WCHAR_SIZE = sizeof(TYPE_WCHAR_T);
SIZE_T_SIZE = sizeof(TYPE_SIZE_T);
BOOL_SIZE = sizeof(TYPE_BOOL);
Bei "BOOL_SIZE" läuft das ganze auf folgenden Fehler:
Code:
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.IllegalArgumentException: Invalid sizeof type 4
at com.sun.jna.Native.sizeof(Native Method)
at com.sun.jna.Native.<clinit>(Native.java:150)
Also der oben dargestellte Codeabschnitt soll der mit jnidispatch.dll zusammenarbeiten und mittels Konstanten (TYPE_VOIDP, TYPE_LONG...) die tatsächliche Anzahl an Bytes für jenen Datentyp auslesen.
Um das ganze besser zu verstehen ist hier auch der SourceCode der DLL, welcher auch von JNA zur Verfügung gestellt wurde.
C:
JNIEXPORT jint JNICALL
Java_com_sun_jna_Native_sizeof(JNIEnv *env, jclass UNUSED(cls), jint type)
{
switch(type) {
case com_sun_jna_Native_TYPE_VOIDP: return sizeof(void*);
case com_sun_jna_Native_TYPE_LONG: return sizeof(long);
case com_sun_jna_Native_TYPE_WCHAR_T: return sizeof(wchar_t);
case com_sun_jna_Native_TYPE_SIZE_T: return sizeof(size_t);
case com_sun_jna_Native_TYPE_BOOL: return sizeof(bool);
default:
{
char msg[MSG_SIZE];
snprintf(msg, sizeof(msg), "Invalid sizeof type %d", (int)type);
throwByName(env, EIllegalArgument, msg);
return -1;
}
}
}
Was mir noch unerklärlich ist woher diese Konstante "com_sun_jna_Native_TYPE_BOOL" kommt, denn diese finde ich weder in der .c Datei noch in der .h Datei zu der DLL.
Kann mir nur erklären das das genau der Pfad ist an welcher auch die Native.java Datei in meinem Projekt liegt (com/sun/jna/Native.java/TYPE_BOOL). Für die anderen 4 Dateitypen funktioniert das ganze ja auch, nur bei TYPE_BOOL springt er in C (in der DLL) in den default Fall rein.
Danke & Grüße
Times