C DLL einbinden und Pointer übergeben

TDO88

Bekanntes Mitglied
Hi Tom,
danke für deine Antwort. Ich habe mir den Artikel angeschaut, bin aber leider auch damit noch nicht wirklich weiter gekommen.
Ich denke das Problem liegt darin, dass die ILSID als Pointer an die DLL übergeben werden muss. Die DLL schreibt dann die erzeugte ILSID direkt in den Speicherplatz, worauf der Pointer zeigt. Als Rückgabewert der DLL kommt nur ein "Fehlercode" zurück, ob das funktioniert hat oder nicht.
Also wie kann ich das implementieren, dass die DLL Zugriff auf den Speicherplatz einer Variable hat?
Ich habe versucht einfach eine int variable anzulegen und diese zu übergeben. Da bekomme ich folgende Exception:
Exception in thread "AWT-EventQueue-0" java.lang.Error: Invalid memory access
at com.sun.jna.Native.invokeInt(Native Method)
at com.sun.jna.Function.invoke(Function.java:383)
at com.sun.jna.Function.invoke(Function.java:315)
at com.sun.jna.Library$Handler.invoke(Library.java:212)
at com.sun.proxy.$Proxy0.LSX_CreateLSID(Unknown Source)
at Dauerlauf.Dauerlauf.jButton1ActionPerformed(Dauerlauf.java:162)
at Dauerlauf.Dauerlauf.access$000(Dauerlauf.java:16)
at Dauerlauf.Dauerlauf$1.actionPerformed(Dauerlauf.java:56)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6297)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3275)
at java.awt.Component.processEvent(Component.java:6062)
at java.awt.Container.processEvent(Container.java:2039)
at java.awt.Component.dispatchEventImpl(Component.java:4660)
at java.awt.Container.dispatchEventImpl(Container.java:2097)
at java.awt.Component.dispatchEvent(Component.java:4488)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4575)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4236)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4166)
at java.awt.Container.dispatchEventImpl(Container.java:2083)
at java.awt.Window.dispatchEventImpl(Window.java:2489)
at java.awt.Component.dispatchEvent(Component.java:4488)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:674)
at java.awt.EventQueue.access$400(EventQueue.java:81)
at java.awt.EventQueue$2.run(EventQueue.java:633)
at java.awt.EventQueue$2.run(EventQueue.java:631)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue$3.run(EventQueue.java:647)
at java.awt.EventQueue$3.run(EventQueue.java:645)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:644)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
BUILD SUCCESSFUL (total time: 5 seconds)
 
Zuletzt bearbeitet:

VfL_Freak

Top Contributor
Hi Tom,
Ich denke das Problem liegt darin, dass die ILSID als Pointer an die DLL übergeben werden muss
Also wie kann ich das implementieren, dass die DLL Zugriff auf den Speicherplatz einer Variable hat?
Also einen Pointer "im C/C++-Sinne" kannst du von Java aus nicht erzeugen, da Java sowas schlicht und einfach nicht kennt!
So ganz spontan fällt mir dazu auch keine nette Lösung ein!
Man könnte per JNI vielleicht auf ein 'normales' C/C++-Programm zugreifen, dass den Wert dann in einen Pointer verwanderlt und an die DLL weiterreicht.
Klingt aber zugegebenermaßen nicht sehr elegant :eek:

Gruß Klaus

EDIT
Habe gerade noch dies gefunden, vlt. hilfts ;)
http://stackoverflow.com/questions/10381773/how-to-pass-pointers-from-java-to-c-in-jni

oder generell dies hier: https://www.google.de/#q=jni+pointer+passing
 

TDO88

Bekanntes Mitglied
Vielen Dank für eure Hilfe.
Jetzt funktioniert es bei mir!
Der Trick mit dem Pointer war es, in der Deklaration der Methode als Datentyp "IntByReference" zu wählen.
Das Interface zu der DLL sieht demnach so aus:
Java:
import com.sun.jna.*;
import com.sun.jna.ptr.IntByReference;


public interface TANGODLL extends Library {
    public int LSX_CreateLSID(IntByReference ILSID);
    public int LSX_ConnectSimple(int lLSID,int lAnInterfaceType,String pcAComName,int lABaudRate,boolean bAShowProt);
    public int LSX_MoveRel (int lLSID,double dX,double dY,double dZ,double dA,boolean bWait);
    public int LSX_Disconnect(int lLSID);
    public int LSX_FreeLSID(int lLSID);
}

Das laden der DLL und aufrufen der Funktionen dann in dieser Form:
Java:
String DLLPath = "C:\\Users\\TDO\\Documents\\NetBeansProjects\\Dauerlauf\\Tango_DLL.dll";
TANGODLL TANGOINST = (TANGODLL) Native.loadLibrary(DLLPath, TANGODLL.class);
       
String COMPort = "COM14";
int returnfunction = 0;
int ILSID = -1;
IntByReference pILSID = new IntByReference(-1);
     
returnfunction = TANGOINST.LSX_CreateLSID(pILSID);
ILSID = pILSID.getValue();

Gruß
TDO
 

Tom299

Bekanntes Mitglied
Ich glaube im jna-package auch eine Pointer-Klasse gesehen zu haben, aber ka ob man die auch nutzen könnte. Aber schön, wenns jetzt geht :)
 

TDO88

Bekanntes Mitglied
Hallo,

jetzt kommt das nächste Problem...
Und zwar möchte ich einfach nur, dass der Benutzer über ein Drop-Down Menü einen verfügbaren COM-Port wählen kann.
Dazu habe ich mir javax.comm runtergeladen und eingebunden und folgendes implementiert:

Java:
public static String[] ComPorts()
    {
        String[] Ports = new String[10];
        int i = 0;
        CommPortIdentifier serialPortId;
        Enumeration enumComm;

        enumComm = CommPortIdentifier.getPortIdentifiers();
       
        while (enumComm.hasMoreElements()) {
            serialPortId = (CommPortIdentifier) enumComm.nextElement();
                if(serialPortId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
                    Ports[i] = serialPortId.getName();
                    i++;
            }
        }
        return Ports;
    }
Leider gibt "CommPortIdentifier.getPortIdentifiers()" Das enum danach bleibt leer und die while Schleife wird direkt übersprungen.
Nach etwas googlen habe ich dann gesehen, dass man die comm.jar, javax.comm.properties und die win32com.dll in entsprechende Ordner kopieren soll.
1. comm.jar nach jre\lib\ext
2. properties nach jre\lib
3. dll nach jre\bin

Jetzt sieht meine Ordnerstruktur so aus:
50137-d7d581be30656d8ddff17a257425b874.jpg


Ich habe alles im "jre1.8.0_45" Ordner entsprechend kopiert, aber es funktioniert leider nicht.
Aus einem anderen Forum sagte jemand, man solle die dll ins system32 Verzeichnis kopieren, aber auch das brachte leider nicht den Durchbruch.
Woher weiß ich denn welches jre oder jdk meine IDE benutzt und habt ihr noch Ideen, was ich machen kann, damit ich meiner COM-Ports auflisten kann?
(Und ja, es sind COM-Ports vorhanden ;))

Gruß
TDO
 

Tom299

Bekanntes Mitglied
Wenn ich externe JARs benutze, dann liegen die bei mir Projektordner unter libs, also würde ich da auch die comm.jar ablegen. Hab noch nie eine JAR im JRE oder JDK Verzeichnis abgelegt.
Wo die properties gesucht werden, läßt sich schwer erraten, vielleicht im gleichen Pfad wie die comm.jar. Aber vielleicht gibts auch Beispiele im Inet dazu?

Wo die dll-liegt, ist vermutlich egal, aber ich denke, du mußt die dll mit regsvr32 registrieren.
 

TDO88

Bekanntes Mitglied
Wenn ich externe JARs benutze, dann liegen die bei mir Projektordner unter libs, also würde ich da auch die comm.jar ablegen. Hab noch nie eine JAR im JRE oder JDK Verzeichnis abgelegt.

Hatte ich auch zunächst, aber da ich das so gelesen hatte, habe ich es umkopiert, in der Hoffnung, dass es dann läuft.

Was ist regsvr32?
 

Tom299

Bekanntes Mitglied
Ich hab mal bischen gesucht ... nutzt du Windows oder Linux? Weder die javax.com noch rxtx scheint es noch für Windows zu geben und unter Linux wird auch RXTX empfohlen. Hab rxtx unter Windows mit Gradle versucht einzubinden, aber da gibts nur die JAR und die alleine reicht leider nicht. Kann es leider nicht weiter testen ...
 

TDO88

Bekanntes Mitglied
Ich nutze Windows 7 64-Bit.
Heißt das, es ist nicht Möglich auf die COM-Ports mit Java unter Windows zuzugreifen?? o_O
 

Tom299

Bekanntes Mitglied
Ok die win32com.dll ist unter windows7 nicht registrierbar (vermutlich weil 32bit?). Habs grad versucht. Da ich aber auch demnächst auf serielle Schnittstellen zugreifen muß, werde ich mal noch ein bischen suchen. Kann mir nicht vorstellen, daß es mit Java unter Windows 7 keine Möglichkeit geben sollte ...
 

Tom299

Bekanntes Mitglied
http://mvnrepository.com/artifact/org.scream3r/jssc/2.8.0

Java:
        import jssc.SerialPortList;
        String portlist [] = SerialPortList.getPortNames();
        for (String s : portlist) {
            System.out.println(s);
           
           SerialPort serialPort = new SerialPort(s);
           try {
               System.out.println("Port opened: " + serialPort.openPort());
               System.out.println("Params setted: " + serialPort.setParams(9600, 8, 1, 0));
               System.out.println("\"Hello World!!!\" successfully writen to port: " + serialPort.writeBytes("Hello World!!!".getBytes()));
               System.out.println("Port closed: " + serialPort.closePort());
           }
           catch (SerialPortException ex) {
               System.out.println(ex);
           }
        }
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
U Einbinden libphonenumber Allgemeine Java-Themen 3
T Externe Java Klasen zur Laufzeit einbinden Allgemeine Java-Themen 10
J Probleme beim einbinden von Zip4j library Allgemeine Java-Themen 6
E Zahlungsmöglichkeiten im Web-App einbinden Allgemeine Java-Themen 4
T StdCall DLL in Java einbinden Allgemeine Java-Themen 13
N HashMap und Methoden richtig einbinden Allgemeine Java-Themen 2
M Suche aktuelle Apache Poi Bibliothek zum Einbinden in mein Programm Allgemeine Java-Themen 2
S Eclipse TestNG: Textfeld einbinden? Allgemeine Java-Themen 1
J Generische Interfaces mehrfach einbinden Allgemeine Java-Themen 11
S Eclipse Github Projekt in eigenes Projekt einbinden und nutzen Allgemeine Java-Themen 13
T iText mit eclipse richtig in Java-Projekt einbinden Allgemeine Java-Themen 2
Pataraca Vererbung Code einbinden Allgemeine Java-Themen 3
MaxG. Bilddateien richtig einbinden Allgemeine Java-Themen 9
J Historische Börsendaten einbinden Allgemeine Java-Themen 14
H API einbinden Allgemeine Java-Themen 5
A Applet in HTML einbinden Allgemeine Java-Themen 1
N Eclipse Projekt von GitHub in bestehendes Projekt einbinden Allgemeine Java-Themen 13
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
S Eclipse Annotation Processor in Eclipse einbinden Allgemeine Java-Themen 0
T Eclipse Dll einbinden java.lang.UnsatisfiedLinkError nur in Eclipse nicht via javac Allgemeine Java-Themen 1
D VBScript in .jar einbinden und aufrufen Allgemeine Java-Themen 5
M Datenbankdatei in Java einbinden Allgemeine Java-Themen 16
C images einbinden Allgemeine Java-Themen 7
T Dll erstellen und einbinden Allgemeine Java-Themen 1
S Externe Eclipse Projekte dynamisch einbinden Allgemeine Java-Themen 3
Thallius Externe .jar dynamisch einbinden Allgemeine Java-Themen 5
X 3d Modelle einbinden Allgemeine Java-Themen 1
Developer_X OpenStreetMap in Java Programm einbinden Allgemeine Java-Themen 10
M Eclipse libgcrypt für window in java Projekt einbinden Allgemeine Java-Themen 1
K Website in Programm einbinden und auslesen Allgemeine Java-Themen 2
M File IO Klasse ... wie einbinden Allgemeine Java-Themen 6
P Sprache ändern ins Programm einbinden Allgemeine Java-Themen 6
L Classpath Klasse einbinden Allgemeine Java-Themen 8
A NodeJs/Javascript txt.Datei einbinden Allgemeine Java-Themen 2
M Barcode und Bilder in PCL einbinden Allgemeine Java-Themen 0
M Variablen Variablen in Text einbinden Allgemeine Java-Themen 5
J rxtxserial.dll für 32 oder 64bit dynamisch einbinden Allgemeine Java-Themen 9
M Javaprogrammierung in Webapp einbinden Allgemeine Java-Themen 7
U Eclipse Java Projekt - Webservice einbinden Allgemeine Java-Themen 7
M Text datei in java jar datei einbinden Allgemeine Java-Themen 4
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
J excel einbinden Allgemeine Java-Themen 2
S Android: SQLite Framework einbinden Allgemeine Java-Themen 2
G JNotfiy-DLL einbinden Allgemeine Java-Themen 4
R Batch / Shell-Skript in Jar.Datei einbinden? Allgemeine Java-Themen 5
S OOP Problembereichsmodell: Bestehende Framework Klasse in eigene Klassenstruktur einbinden Allgemeine Java-Themen 9
B Input/Output Einbinden von Daten in Java Allgemeine Java-Themen 3
L Einbinden von Daten in ausführbare Jar Allgemeine Java-Themen 6
E Assembler einbinden Allgemeine Java-Themen 3
X Applet läuft nicht, Applet in Webseite einbinden Allgemeine Java-Themen 4
P Applet java 1.7 in Website einbinden ? Allgemeine Java-Themen 7
P Applet Applet einbinden Probleme Allgemeine Java-Themen 2
T Bild in jar Paket einbinden Allgemeine Java-Themen 9
P Icon aus Exe einbinden Allgemeine Java-Themen 12
E mplayer in Java einbinden Allgemeine Java-Themen 17
A Klasse in GUI einbinden Allgemeine Java-Themen 18
S Javadoc 3d einbinden macht probleme Allgemeine Java-Themen 10
H -Xmx1024m in JAR einbinden Allgemeine Java-Themen 16
T Java in Website einbinden klappt i-wie nicht Allgemeine Java-Themen 13
U (Land-)Karten in Java Anwendung einbinden (GoogleMaps/OpenStreetMap) Allgemeine Java-Themen 7
M .jar in HTML einbinden Allgemeine Java-Themen 5
T Einbinden einer Library in NetBeans Allgemeine Java-Themen 3
S Jar Graphiken einbinden mit Eclipse Allgemeine Java-Themen 9
S RXTX library in Jar einbinden Allgemeine Java-Themen 5
T DLL in Java einbinden (Quelltext aus Excel VBA) Allgemeine Java-Themen 5
S Dll einbinden Allgemeine Java-Themen 5
S C Sourcecode in Java einbinden Allgemeine Java-Themen 7
S ANT mysql treiber einbinden Allgemeine Java-Themen 4
X Bild aus dem Netz von URL runterladen und in GUI einbinden. Allgemeine Java-Themen 3
F OpenOffice Writer in Java einbinden Allgemeine Java-Themen 8
hdi JavaMail Lib einbinden? Allgemeine Java-Themen 5
U Servlet in Webseite einbinden Allgemeine Java-Themen 1
X dll's in jar einbinden Allgemeine Java-Themen 32
G Eclipse Wie mit Ant build.xml externe Jar´s einbinden? Allgemeine Java-Themen 5
R Font in PDF einbinden Allgemeine Java-Themen 2
M JApplet einbinden in HTML Allgemeine Java-Themen 19
C RXTX Treiber einbinden für Linux Allgemeine Java-Themen 6
M Java Web Start - Native DLL einbinden Allgemeine Java-Themen 2
H Externes Programm in JAR einbinden Allgemeine Java-Themen 11
SuperSeppel13 Dynamische Bibliotheken einbinden Allgemeine Java-Themen 16
H image in jtextarea/JLabel einbinden... Allgemeine Java-Themen 4
L einbinden einer php datei Allgemeine Java-Themen 16
A Java Bridge probleme - einbinden fehlgeschlagen/php kennt "java_required" nicht Allgemeine Java-Themen 3
M .jar einbinden Allgemeine Java-Themen 4
D Jython in Applikation einbinden Allgemeine Java-Themen 3
C Fremden Code ins Programm einbinden Allgemeine Java-Themen 12
S Package in verschiedene Projekten einbinden? Allgemeine Java-Themen 3
C Programm ins Kontextmenü vom Explorer einbinden Allgemeine Java-Themen 9
Developer_X Avatar/Bild ins Profil einbinden Allgemeine Java-Themen 10
H Einbinden einer 3rd party DLL via Java Wrapper (JNI) Allgemeine Java-Themen 11
M *.dll Datei (Bibliothek) in Eclipse einbinden Allgemeine Java-Themen 9
S Javadoc einbinden Allgemeine Java-Themen 8
B Eclipse externe Dateien mit einbinden Allgemeine Java-Themen 10
F Java Print mit Applet einbinden Allgemeine Java-Themen 2
J Seltsame Exception beim Java Applet einbinden in Html Allgemeine Java-Themen 2
G Libs in jar einbinden Allgemeine Java-Themen 2
K exe Programm einbinden/ansprechen Allgemeine Java-Themen 5
K jar Datei in Paket einbinden Allgemeine Java-Themen 2
B animierte .gif's in java einbinden Allgemeine Java-Themen 7
I Neue Klassenbibliothek in Klassenpfad einbinden Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben