Probleme mit Methodenaufruf von Klasse in dll (jni)

Status
Nicht offen für weitere Antworten.

dan72

Mitglied
Hallo !

Ich glaub, ich habe ein Verständnisproblem zu jni.
Ich habe jetzt schon einige Beispiele ergoogeld aber nichts hat geholfen.
Folgendes Problem:
Ich habe eine DLL zur Verfügung gestellt bekommen.
In dieser DLL ist die Java Klasse JobInterface.
Von JobInterface wurde eine Headerdatei erstellt.
Diese Headerdatei ist in einer C++ Klasse eingebunden, die die Methoden enthält, die in
der JobInterface Klasse als native deklariert sind. Außerdem wird
Beispiel:
Code:
public class cSiqJobInterface
{



//------ Definition der nativen Funktionen für diese Klasse ------

   
  public static native int ErledigeJob( int l, int l2 );
Hieraus wurde die DLL binder.dll erstellt.
Ich habe nun eine Java Klasse erstellt, in der ich die dll einbinden möchte, um
die Funktionen der Klasse JobInterface in der dll zu nutzen.
Diese Klasse liegt im gleichen Verzeichnis wie die dll.

Codeauschnitt von aufrufender Klasse:
Code:
public class TryDLL {
	
	
	public static void main(String[] args) {
		
		
		//dll einbinden mit pfad
		//System.load("C:\\workspace\\dllprojekt\\binder.dll");
		
		
}
Beim einbinden der dll bekomme ich keine Fehlermeldung.
Ich weiß nur nicht, wie ich nun an die Funktionen rankomme.
Ich habe schon versucht ein Objekt von JobInterface zu erstellen oder die Methoden direkt aufzurufen
oder statisch.es wird aber nichts erkannt z.B.:
JobInterface cannot be resolved to a type

Ich denke, daß ich Grundsätzlich etwas falsch mache.
Bin für jede Anregung und Hilfe dankbar.


Gruß dan
 
G

Guest

Gast
Ja Genau!
Das mit dem Objekt erzeugen war auch nur aus Verzweiflung :)
Ich habe auch versucht die Methoden direkt in meiner aufrufenden Klasse TryDLL aufzurufen.
Aber wenn ich z.B. ErledigeJob( 1, 1 ) aufrufe, wird diese Funktion dann als Funktion der Klasse TryDLL erkannt - und die gibt es ja nicht :-(
Wie rufe ich diese Methoden also auf?
Genau das ist mein Problem.

Gruß Dan
 

thE_29

Top Contributor
Ein Dll kann man nicht mit Pfad laden!

Der muss schon in einem library Pfad sein oder im aktuellen Verzeichnis!
 
A

Anmeldeboykottierer

Gast
Hi,
ich glaube du machst da noch ein paar Kleinigkeiten falsch.
Die Bibliothek wird mit System.LoadLibrary geladen.
Zudem gehört das Laden der Bibliothek in die Klasse, die die Methoden anbietet. Die nativen Methoden sollen letztlich gegen die dyn. Bibliothek gelinkt werden.
Du hättest also Code der Form:
Code:
public class cSiqJobInterface 
{ 
//------ Definition der nativen Funktionen für diese Klasse ------ 
 public static native int ErledigeJob( int l, int l2 );

  static {
    System.loadLibrary(DLL/SO);
  }
}

public class TestDll {
  public static void main(String[]  args)  {
    cSiqJobInterface.ErledigeJob(1,1);
  }
}

Wobei die Bennenung hier vollkommen gegen die Konventionen ist. Klassen und Interfaces beginnen mit einem Großbuchstaben, Methoden mit einem Kleinen.
Du schreibst diese .java Datei, erzeugst dir dazu den Header und dann implementierst mit diesem die dyn. Bibliothek.
Diese wird mittels static dort gelinkt, wo sie auch benötigt wird (in der klasse, die native Methoden anbietet).

Gruß Der Anmeldeboykottierer
 
G

Guest

Gast
Hi Lord BenneX!

Dachte ich auch. So sieht meine aufrufende Klasse aus.

Code:
 class TryDLL {
	
	public static void main(String[] args) {
		
		new cSiqJobInterface().ErledigeJob(1,1);
		
	}

}

Wie gesagt ist cSiqJobInterface die Klasse, wo die nativen Methodendeklarationen sind und von der die Headerdatei für die c++ Klasse mit den Methodenimplementationen erstellt wurde. Die DLL wird auch in dieser Klasse geladen.
Die Klasse und Methode sollte doch erst erkannt werden, wenn das Programm läuft, da es ja dynamisch eingebunden wird.
Es wird aber immer gesagt, daß die Klasse oder der Typ nicht aufgelöst werden kann, wenn ich die TryDLL kompiliere:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
cSiqJobInterface cannot be resolved to a type

at TryDLL.main(TryDLL.java:7)


Hi thE_29
Die DLL binder.dll ist im aktuellem Verzeichnis.
Und ist es nicht so?(aus der javadoc):

public static void load(String filename)
Loads a code file with the specified filename from the local file system as a dynamic library.
The filename argument must be a complete path name.

und mit LoadLibrary wird kein path mitgegeben?

Gruß Dan
 

dan72

Mitglied
Hallo Anmeldeboykottierer!

Hab' doch tatsächlich deinen Eintrag übersehen :oops:
Genau so geschieht es auch.
Die dll wird mit loadLibrary in der Klasse mit den nativen Methoden aufgerufen.
Hatte Sie nur nochmal in meiner aufrufenden Klasse geladen, da es nicht geklappt hat aber wieder rausgeschmissen.
Meine aufrufenden Klasse sieht folgendermaßen aus:
Code:
class TryDLL {
	
	public static void main(String[] args) {
		
		new cSiqJobInterface().ErledigeJob(1,1);
		//cSiqJobInterface.ErledigeJob(1,1);
               

		
		
	}

}
Habe die beiden Aufrufe der Methode probiert aber funzt net.
Fehlermeldung:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
cSiqJobInterface cannot be resolved

at TryDLL.main(TryDLL.java:8)

Die Klasse ist unbekannt :-(

Für die Konventionsverletzung kann ich nichts.
Ich habe die dll zur Verfügung gestellt bekommen, zusammen mit der Headerdatei von cSiqJobInterface.
Ich habe also keinen Einblick in die Codeimplementierung.

Gruß Dan
 
A

Anmeldeboykottierer

Gast
Äh, wieso seh ich das erst jetzt?! Lass mal das static weg. Dann stimmt einerseits dein new Operator wieder, andererseits glaube ich kann das so auch nicht funktionieren.
Static bindet eine Methode statisch ein, der Aufruf erfolgt aber durch das Linken gegen eine dynamische Bibliothek, ich denke hier kann es leicht zu einem Fehler kommen (wie will man etwas dyn. und statisch linken?).
Da die Adresse der Methode erst zur Laufzeit ermittelt wird, kannst du hier nicht statisch linken (behaupte ich mal), wahrscheinlich kracht es einfach an der Stelle.

Gruß Der Anmeldeboykottierer
 
A

Anmeldeboykottierer

Gast
Um Missverständnissen vor zu beugen, ich nochmal:
Ich meinte das static vor dem native!
 
G

Guest

Gast
Erst einmal danke für eure Hilfe.

Folgendes ist schon alles, was eclipse ausschmeißt:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
cSiqJobInterface cannot be resolved

at TryDLL.main(TryDLL.java:8)

Der Entwickler, von dem ich die dll habe, hat die dll erfolgreich in seiner Umgebung am Laufen gehabt.
Deswegen muss das mit dem static, wie the_29 schon sagte, auch stimmen.
Die dll ist ja im gleichen Verzeichnis wie die aufrufende Klasse.
Aufgerufen habe ich die Methoden schon auf unterschiedlichste Weise, da ich in Tutorials jeweils unterschiedlich Möglichkeiten gesehen habe.
Wenn es wirklich so ist, das es reicht die dll im gleichen Verzeichnis zu haben (braucht den Pfad der dll also nicht bekannt machen) und es reicht die native Funktion in ein Java Klasse mit z.B. cSiqJobInterface.ErledigeJob(1,1); aufzurufen, dann kann ja eigentlich nur was an der dll nicht stimmen... denke ich.
Es ist doch so, das der Compiler nach der Klasse in der dll sucht(im aktuellen Verzeichnis) wenn er keine anderen Informationen über die Klasse hat?
Ich habe auch schon ein Tutorial gesehen, in dem die native Methode direkt aufgerfuen wird.
In meiner aufrufenden Klasse würde dann einfach stehen:

Code:
public class TryDLL 
{
	public static void main(String[] args) 
	{
		ErledigeJob(1,1); 
	}
}

aber da habe ich die Exception:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method ErledigeJob(int, int) is undefined for the type TryDLL

at TryDLL.main(TryDLL.java:5)

Wird also gar nicht als native Methode erkannt.
Ich habe nicht mehr die geringste Ahnung, was ich noch versuchen kann.
Vielleicht habt ihr ja noch eine letzte Idee.

Gruß Dan
 

thE_29

Top Contributor
Wie hast du die dll gelinkt?

Wenn du es mit GCC gemacht hast, nimm den MS Compiler (Visual Studio express ist gratis)

Ich habe noch nie ne DLL mit gcc zum Laufen gebracht!
 
A

Anmeldeboykottierer

Gast
Hi,
was du hier machst ist ja auch falsch. Die native Methode liegt nicht in der Klasse TryDll. Also musst du die schon aus der Klasse heraus aufrufen, zu der die native Methode gehört.
Für diese ist wichtig, dass die im gleichen Package liegt, wie beim Ersteller der dll (sonst gibt es auch hier wieder probleme).
 
G

Guest

Gast
Hallo!

@the_29
Laut Entwickler ist es mit Visual Studio gelinkt.
Ich habe da auch keine Möglichkeit etwas zu machen, da ich nur die dll habe, die ich nutzen möchte.

@Anmeldeboykottierer
Den Aufruf nur mit der Methode ist auch nur eine Beschreibung gewesen.
Ich habe auch versucht mit der Klasse aufzurufen. Ich habe das mit dem Direktaufruf einer Methode in einem Tutorial gesehen. Wollte damit nur sagen, daß ich in der Hinsicht schon einiges probiert habe.
Das mit dem Package hört sich aber interessant an.
Ich habe Die Aufrufende Klasse und die dll im gleichen Verzeichnis. Muss ich noch irgendwas mit packages machen damit die dll und damit die Klasse mit den nativen Methoden angesprochen werden kann???

Gruß dan
 
G

Guest

Gast
Ich schick jetzt ers einmal die dll mit meinem Aufruf zurück.
Mal sehen was sich ergibt. werde ich dann posten.

Vielen Danke erst einmal.
 

dan72

Mitglied
Hallo an Alle !

Jetzt habe ich mal alle Informationen zusammengestellt, die ich zur Verfügung stellen kann.
Vielleicht habe ich ja bisher Informationen nicht richtig dargestellt.
Ich habe die Dll siqCnn.dll. Diese habe ich mal mit dem Programm Dependency Walker untersucht.
Dort konnte ich auch durch die Einträge erkennen, daß die Klasse cSiqJobInterface und die Funktion
SetJob in der DLL vorhanden sind.
Hier mal die Darstellung im Dependency Walker:

_Java_siq_cSiqJobInterface_SetJob@16

Hier ist auch zu sehen, das alles im Verzeichnis ( package) siq vorhanden ist oder war.
Ich habe mir auf meinem Rechner nun das Verzeichnis dllloader erstellt.
Hier habe ich die Java Klasse, die die Klasse cSiqJobInterface in meiner dll aufrufen soll.
Aufrufende Klasse TestFile.java im Ordner dllloader lautet wie folgt:

Code:
import siq.*;

public class TestFile 
{
	public static void main(String[] args) {
		
		
		 //new siq_cSiqJobInterface().SetJob(0,1);//so hab ich's auch probiert
		 cSiqJobInterface c = new cSiqJobInterface();
		 c.SetJob(0,1);
		System.out.println(System.getProperty("java.library.path"));//mal die LD_LIBRARY_PATH ausgeben
	}
}
Nun habe ich das Unterverzeichnis siq erstellt. Hier befindet sich nun meine siqCnn.dll.
Wenn ich nun die TestFile kompiliere und ausführe, bekomme ich folgende Meldung:

TestFile.java:15: cannot find symbol
symbol : class cSiqJobInterface
location: class TestFile
cSiqJobInterface c = new cSiqJobInterface();

2 errors

Ich denke, ich habe alles aufgeführt. Ich kommentiere alles bis auf den java.library.path aus.
Dann kann man noch die Einträge in der LD_LIBRARY_PATH sehen.
Ein kleiner Auschnitt:

C:\WINDOWS\system32;.;C:\WINDOWS\system32;C:\WINDOWS; usw.

Die dll habe ich auch mal im Ordner system32 gepackt.

@thE_29 ________________________________________________

Ich mache irgendwie immer den gleichen Fehler.
Ich habe mal versucht deine DLL anzusprechen, die du mir als link gesetzt hast.
Ich habe im Verzeichnis dlltest wieder eine aufrufende Klasse für die dll:

Code:
import at.jta.process.*;


public class TestFile 
{
	public static void main(String[] args) {
		Win32Killer w = new Win32Killer();
	}
}

Einfach nur um ein Objekt einer deiner Klassen zu erzeugen.
Dann habe ich die Unterverzeichnisse für das package erzeugt.
Erst das Verzeichnis at, darin jta und darin das Verzeichnis process.
Dort habe ich dann deine dll.
Wenn ich die Klasse TestFile ausführe, habe ich fast genau die gleiche Ausgabe wie mit meiner siqCnn.dll:

TestFile.java:7: cannot find symbol
symbol : class Win32Killer
location: class TestFile
Win32Killer w = new Win32Killer();

Es wird vorher auch noch gemeckert, daß es das package net gibt.
TestFile.java:1: package at.jta.process does not exist
import at.jta.process.*;

Ich weiß wirklich nicht, wo ich einen Fehler mache.
Hoffe Jemand kann mir weiterhelfen.

Gruß Dan[/code]
 

dan72

Mitglied
Hi thE_29!

Der letzte Satz hat's gebracht. Ich glaube ich hab's jetzt.
Ich bin ganz falsh rangegangen, weil ich am Anfang nur die DLL bekommen habe und damit habe ich dann angefangen zu arbeiten. Vielen Dank nochmal. Ich probier gleich nochmal die "Funktionen" in der dll anzusprechen.


Gruß Dan
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
S Umstellung von File auf Path - Probleme mit Stream Allgemeine Java-Themen 5
C Probleme mit javax.mail.Session Allgemeine Java-Themen 8
M tomcat probleme Allgemeine Java-Themen 1
N Division macht Probleme Allgemeine Java-Themen 14
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
MarvinsDepression Probleme mit relativem Dateipfad Allgemeine Java-Themen 1
G Geotools Probleme nach PC-Wechsel Allgemeine Java-Themen 6
nibe1501 GUI Probleme Allgemeine Java-Themen 16
C Probleme mit dem WindowBuilder Allgemeine Java-Themen 3
P Selenium . Probleme ein Iron Icon Element anzusprechen Allgemeine Java-Themen 2
B Compiler-Fehler Probleme beim Kompilieren mit Jsoup Allgemeine Java-Themen 8
K VisualVM Profiling Remote Probleme Allgemeine Java-Themen 1
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13
M Probleme bei Eclipse wenn ich entpacke Allgemeine Java-Themen 15
D Regex Probleme Allgemeine Java-Themen 2
M Probleme jar datei. Allgemeine Java-Themen 2
L Vererbung Verständnis Probleme Vererbung Allgemeine Java-Themen 2
Dann07 Probleme mit OpenAL Allgemeine Java-Themen 0
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
V Compiler-Fehler Online Compiler Probleme Allgemeine Java-Themen 4
M Probleme mit Negamax-Algorithmus Allgemeine Java-Themen 29
M Probleme mit BigDecimal Allgemeine Java-Themen 1
T Probleme mit NumberFormat Allgemeine Java-Themen 5
J Probleme exe-Start mit Task Scheduler Allgemeine Java-Themen 1
B Input/Output Probleme beim Ausführen von Shell-Befehlen mit Java Allgemeine Java-Themen 28
J Probleme beim einbinden von Zip4j library Allgemeine Java-Themen 6
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
K Data Konverter - Probleme mit Byte[] Kodierung Allgemeine Java-Themen 3
T Probleme mit dem Pfad zum Propertie file Allgemeine Java-Themen 7
H Swing HashMap zu Tabelle macht mir Probleme Allgemeine Java-Themen 4
Neoline Interpreter-Fehler Probleme mit Arrays.toString Allgemeine Java-Themen 7
F SQLite mit Java / Probleme beim INSERT Befehl Allgemeine Java-Themen 4
J Erste Schritte Probleme mit der Hauptklasse Allgemeine Java-Themen 14
J Tetris Probleme bei Klassen Allgemeine Java-Themen 14
J MinMax VierGewinnt Probleme Allgemeine Java-Themen 22
J Probleme mit CodeCoverage und Lombok Equals Allgemeine Java-Themen 1
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
R Snake Probleme Allgemeine Java-Themen 2
A Probleme beim Verstehen einer Aufgabenstellung Allgemeine Java-Themen 11
RalleYTN 3D Objekt Translation basierend auf Rotation (Probleme mit Z Rotation) Allgemeine Java-Themen 0
Bluedaishi Druck Probleme mit PDF dateien Allgemeine Java-Themen 4
G Ant Probleme bei einer Installation die Apache ant+ivy verwendet Allgemeine Java-Themen 14
E TableView Probleme Allgemeine Java-Themen 7
perlenfischer1984 Probleme beim Mocken Allgemeine Java-Themen 6
S Kaffemaschine Programmierung Probleme Allgemeine Java-Themen 2
K Threads Runtime und Process Probleme Allgemeine Java-Themen 3
S Probleme mit unterschiedlichen Java-Versionen (Mac OS X 10.11) Allgemeine Java-Themen 0
S Event Handling keyPressed()-Probleme Allgemeine Java-Themen 2
VfL_Freak Große und seltsame Probleme nach Java-Update auf V1.8.0_91 Allgemeine Java-Themen 3
P Probleme mit Grafik (Java) Allgemeine Java-Themen 6
R probleme beim starten von jar unter linux Allgemeine Java-Themen 2
H Probleme mit DAY_OF_WEEK Allgemeine Java-Themen 4
Arif Probleme mit NullPointerException Allgemeine Java-Themen 2
E Probleme mit nextInt() und Exception Allgemeine Java-Themen 35
Streeber Probleme mit AWT-EventQueue: ArrayList Elemente hinzufügen Allgemeine Java-Themen 1
D Performance-Probleme mit Joda-Time Allgemeine Java-Themen 3
M Probleme beim rechnen, bei Zahlen mit führenden Nullen. Allgemeine Java-Themen 7
RalleYTN Probleme mit Encrypting Allgemeine Java-Themen 10
M Probleme mit Schriftarten PDFBox Allgemeine Java-Themen 3
J Probleme mit der Java-Runtime Allgemeine Java-Themen 10
G Probleme mit BufferedWriter und URL Allgemeine Java-Themen 4
S Probleme mit meinem MacBook Pro DRINGEND HILFE erbeten! Allgemeine Java-Themen 17
Androbin Interpreter-Fehler Probleme mit Rekursion - StackOverflowError Allgemeine Java-Themen 8
E JCuda-0.6.5 Probleme beim ausführen der Datei Allgemeine Java-Themen 0
M Runtime.exec() verursacht auf manchen Systemen Probleme - Ursache unklar Allgemeine Java-Themen 2
W JNDI - LDAP - Probleme beim editieren von Usern Allgemeine Java-Themen 0
R DBUnit Performance Probleme Allgemeine Java-Themen 0
S Probleme mit Collection Allgemeine Java-Themen 7
L Probleme mit Jar Allgemeine Java-Themen 6
N Zahlensysteme umrechnen; Probleme beim Umwandeln Allgemeine Java-Themen 4
K OOP OOP Gui Spiel + Vererbungen Probleme durch Nichtwissen!! Allgemeine Java-Themen 1
F Java Native/Shared Library (.so) laden macht Probleme Allgemeine Java-Themen 3
J Synchronized Probleme Allgemeine Java-Themen 7
J Java Progressbar & Download Probleme Allgemeine Java-Themen 10
S Probleme mit dem filechooser Allgemeine Java-Themen 1
J Comperator Probleme Allgemeine Java-Themen 4
A Probleme beim auslesen von Quelltext (HTML) Allgemeine Java-Themen 5
S Probleme mit Webappplikation Allgemeine Java-Themen 5
L Plötzlich Probleme mit der JVM :( Allgemeine Java-Themen 6
S starke performance probleme des forums Allgemeine Java-Themen 10
K Probleme bei Berechnung der Komplexität Allgemeine Java-Themen 7
R JRE Ablaufdatum seit 7u10 - Probleme bei selbst ausgelieferter JRE bekannt? Allgemeine Java-Themen 3
H Reg Exp Probleme Allgemeine Java-Themen 5
M Classpath Probleme bei JAR Generierung Allgemeine Java-Themen 2
S Probleme mit JAVA-Installation Allgemeine Java-Themen 3
D Probleme bei for-Schleife Allgemeine Java-Themen 4
R Probleme mit Javadoc Allgemeine Java-Themen 2
G Gson Probleme Allgemeine Java-Themen 2
P KI für TicTacToe programmieren > Probleme Allgemeine Java-Themen 2
M Google App Engine macht Probleme Allgemeine Java-Themen 4
H Probleme mit finally-Block und close() Allgemeine Java-Themen 4
F 2d array probleme Allgemeine Java-Themen 2
M 3D-Grafik Probleme beim drehen von Objekten Allgemeine Java-Themen 9
T Interface Probleme Allgemeine Java-Themen 8
C Eclipse Probleme bei selbst erstelltem Algorithmus Allgemeine Java-Themen 2
M Probleme mit String in Label übergeben. Allgemeine Java-Themen 6
H MediaManager Fragen/Probleme Allgemeine Java-Themen 6
U Probleme mit Kopiervorgang Allgemeine Java-Themen 3
S Probleme beim Auslesen einer Liste Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben