Jni dll

Status
Nicht offen für weitere Antworten.
R

redpoint007

Gast
Hallo Zusammen,
ich habe eine DLL Datei xy.dll ! Laut Doku besitzt diese eine DLL eine Methode TEMPERATUR die ein Wert übergeben bekommt und einen anderen zurückliefert. Die Übergabe und Rückgabewerte sollen laut doku double sein..
ich lade das ganze so:

static {
System.loadLibrary( "xy" );
}
public static native int TEMPERATUR(double a);

in der main steht bei mir: double a = TEMPERATUR(2.23);

doch ich erhalte immer die Fehlermeldung:
Exception in thread "main" java.lang.UnsatisfiedLinkError: javaapplication6.Main.VBPT(DD)I
at javaapplication6.Main.VBPT(Native Method)


Ich hab mich mangels Zeitdruck noch nicht mit JNI beschäftigt! Hoffe einer von euch kann mir Helfen.

Gruß
 

Marco13

Top Contributor
Offenbar wird in deinem Java-Code auch irgendwo eine Methode "VBPT" aus der Klasse "Main" aufgerufen, und diese Methode ist als "native" deklariert, aber nicht in einer der geladenen DLLs vorhanden.
 
R

redpoint007

Gast
Soory, mein Fehler! Das VBPT soll eigentlich TEMPERATUR heißen, hab nur falsch kopiert! Also es wird nur TEMPERATUR aufgerufen, halt aus einer DLL die schon vorgegeben ist!
 
R

redpoint007

Gast
Mittlerweile fand ich die lösung des Problems eine DLL zu laden mittels JNA!
Also ich lade die Funktion PBT welche ein doublewert aufnimmt und ein double zurückgibt!

public class Main {
public interface Test extends Library {
public double PBT(double x);

}

public static void main(String[] args) {
Test lib = (Test) Native.loadLibrary("DLLDATEINAME",Test.class);
System.out.println(lib.PBT(200.2));

}
}

Wenn ich die funktion aus der DLL aufrufe kracht es:

# An unexpected error has been detected by Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x03018ce7, pid=4012, tid=2644
#
# Java VM: Java HotSpot(TM) Client VM (10.0-b19 mixed mode, sharing windows-x86)
# Problematic frame:
# C [IF97BO.dll+0x48ce7]
.......
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.

Wenn ich der Funktion kein Wert übergebe, sprich aus public double PBT(double x); wird double x gelöscht und lib.PBT(200.2) wird lib.PBT(); läuft alles gut!!!
 

Marco13

Top Contributor
Hm. Ohne die Kenntnis der DLL kann man da nicht viel sagen. Die Frage, ob du vielleicht noch irgendwo einen Copy&Paste-Fehler hast, drängt sich jetzt natürlich auf. Bzgl. des Absturzes gibt es jetzt aber IMHO nur zwei mögliche Gründe: Entweder, es gibt die Funktion
PBT(double)
nicht, und der Versuch, sie aufzurufen, haut JNA so dermaßen raus (was aber IMHO nicht der Fall sein sollte - JNA sollte solche Fehler eigentlich auf "höherer Ebene" abfangen, und nicht mit so einem Low-Level-Crash abrauchen), oder es GIBT die Funktion, und in dieser Funktion passiert irgendwas schlimmes (z.B. Null Pointer zugriff oder so)
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben