2013-02-21 18 views
6

Ich muss externe DLL-Bibliothek Funktion von Java-Code aufrufen. Ich benutze Netbeans 7.2. Meine DLL-Funktionen sind:So rufen Sie externe DLL-Funktion von Java-Code

Boolean isValid(string word) 
List<String> getWords(String word) 

ich this Beispiel bin nach. Aber ich weiß nicht, wie ich meine DLL funktioniere. Und ich fand ein weiteres link. Aber es funktioniert nicht für mich.

+6

"Es funktioniert nicht für mich" ist nicht * fast * genug Informationen für uns, um Ihnen zu helfen. Sie müssen uns sagen, was Sie versucht haben und was die Ergebnisse waren. Bitte lesen Sie http://tinyurl.com/so-list –

+0

Was nicht funktioniert?Kannst du etwas Code von dem, was du versucht hast, teilen? –

+0

Für Linux: http://stackoverflow.com/a/30635871/895245 –

Antwort

2

Sie das Java Native Interface (JNI) verwenden müssen, die einen Satz von C/C++ Funktionen ist, dass native Code erlauben, mit Java-Code zu verbinden (das heißt Parameter von Java-Funktionsaufrufe empfängt, die Ergebnisse zurückkehrt, etc). Schreiben Sie eine Wrapper-C-Bibliothek, die JNI-Aufrufe empfängt und dann Ihre externe Bibliothek aufruft.

Zum Beispiel ruft die folgende Funktion ein Verfahren updateHandlers auf einem nativen Objekt (das heißt, so lange in der Java-Seite gespeichert).

class MyImpl { 
    void updateHandlers(JNIEnv *env) { 
    this->contentHandler = ....; 
    } 
} 

JNIEXPORT void JNICALL Java_package_Classname_updateHandlers0 
    (JNIEnv *env, jobject obj, jlong ptr) 
{ 
    ((MyImpl*)ptr)->updateHandlers(env); 
} 

Die entsprechenden Erklärungen in package.ClassName sind:

private long ptr; //assigned from JNI 
public void updateHandlers() { 
    if (ptr==0) throw new NullPointerException(); 
    updateHandlers0(ptr); 
} 
private native void updateHandlers0(long ptr); 

static { 
    try { 
      /*try preloading the library external.dll*/ 
     System.loadLibrary("external"); 
    } catch (UnsatisfiedLinkError e) { 
     /*library will be resolved when loading myjni*/ 
    } 
    System.loadLibrary("myjni"); //load myjni.dll 
} 
1

Sie deklarieren native Funktionen in Java (native private ...) mit der Unterschrift, die Sie benötigen; Führen Sie dann javah (ein Tool, das mit dem JDK bereitgestellt wird) aus, um die systemeigenen Header zu generieren. A List<String> (eigentlich ein List, wegen Typ löschen) ist ein jobject in nativem Code.

Die C-Methode entspricht, wäre:

JNIEXPORT jobject JNICALL package_Classname_getWords(JNIEnv *env, jobject jobj, jstring word) 

ich denke, es wäre einfacher, ein Array von Strings jobjectArray und instanziiert die Liste in java von den zurückgegebenen Werten zurückzukehren. Siehe this example.

6

Ich stolperte über das gleiche Problem "DLL aus Java aufrufen" und zuerst war frustriert über die Komplexität. Dennoch gibt es eine elegante Lösung (könnte auch für die Leute dort im processing.org-Habitat interessant sein.) Angesichts der eher "allgemeinen" Form der Frage (vielleicht ist Downrating dafür nicht gerechtfertigt), nehme ich an wäre eine eher lockere Lösung angezeigt. Mit anderen Worten, eine Lösung, die vermeidet, dass man mit Header-Dateien, zusätzlichen Konvertierungen usw. arodiert, genauso wie der Quellcode nicht unbedingt verfügbar ist.

Meine Empfehlung dafür wäre JNA (https://github.com/twall/jna), die im Grunde eine vereinfachte Wrapper um JNI ist. Es funktioniert gut, Typ Mapping ist einfach (z. B. pchar = Lpcstr Puffer -> String), obwohl ich es nur in Windows DLLs und meine eigenen C-style DLLs mit Delphi-Pascal erstellt verwenden. Die einzige Sache, die berücksichtigt werden sollte, ist, dass Rückgabewerte durch Funktionen und nicht als "out" markierte Referenzvariablen exportiert werden sollten. Die Frage verweist bereits auf eine verknüpfte Quelle, die dafür ein Beispiel liefert (daher können Antworten rund um JNI hier fehlplatziert sein). Beachten Sie, dass der angegebene Link auch Beispiele für die Übertragung von Arrays und Zeigern enthält.

Verwandte Themen