JNI

Status
Nicht offen für weitere Antworten.

hans.karl

Mitglied
Code:
public class KI { 
  static 
   { System.loadLibrary("InmiChess"); } 
  public native void InmiChessSetStartPosition(); 
   public KI() { 
    System.out.println(System.getProperty("java.library.path")); 
    //System.setProperty("java.library.path","Z:\\"); 
    System.loadLibrary("InmiChess"); 
    System.out.println(System.getProperty("java.library.path")); 
    InmiChessSetStartPosition(); 
  } 
  public static void main(String[] args) { 
    System.loadLibrary("InmiChess"); 
    KI KI1 = new KI(); 
  } 
}

Die DLL InmiChess.dll bekommt ihr unter: http://www.chessbase.com/download/engines/inmichess.zip

Wenn ich dieses Programm ausführe, kommt die Exeption:
java.lang.UnsatisfiedLinkError: InmiChessSetStartPosition
at KI.InmiChessSetStartPosition(Native Method)
at KI.(KI.java:11)
at KI.main(KI.java:15)
Exception in thread "main"

Prototyp für diese Funktion:
Code:
__declspec(dllexport) void __cdecl 
InmiChessSetStartPosition() 
{ 
int rc; 
    aCallback.showText("New Board"); 
    rc=startaufstellung(); 
} /*OK*/

Ich möchte diese DLL einbinden (schachengine), und dann diese Funktionen aufrufen. Ist es überhaupt möglich, diese Art von DLLs (offensichtilich sehr umfangreicher Code) einzubinden?

Gibt es Konverter, die die jni.h in die DLL einbinden usw., sprich die DLL in eine für JNI nutzbare DLL umwandeln? :bahnhof:
 

thE_29

Top Contributor
Benenn die Library mal gleich wie deine Java Klasse!

Vergiß die Packages etc nicht miteinzutragen....


Das sind so Fehler, die dafür sorgen können, das er sie dir net lädt!!
 

messi

Bekanntes Mitglied
JNI benutzt eine ziemlich kranke Signatur für Funktionen. Benutze immer javah, um Stubs zu erstellen.
Code:
JNIEXPORT void JNICALL Java_KI_InmiChessSetStartPosition
  (JNIEnv *, jobject);
 

hans.karl

Mitglied
Die DLL ist eine fertige und ich habe den Source Code nicht, desshalb kann ich auch kein javah usw. einbinden!

Ich hatte mir gedacht, ob es einen "DLL Converter" gibt, um die DLL "JNI fähig" zu machen oder ob es auch so geht, und da kommt dann die tolle Exception ins Spiel.
 

messi

Bekanntes Mitglied
hans.karl hat gesagt.:
Die DLL ist eine fertige und ich habe den Source Code nicht, desshalb kann ich auch kein javah usw. einbinden!
Du mußt schon korrekte JNI-Definitionen verwenden. Bastel mit der Hilfe von javah entsprechende Wrapper-Funktionen und schreib die in eine eigene DLL, die dann wiederum dynamisch die eigentliche DLL linkt.
 
Status
Nicht offen für weitere Antworten.

Oben