2013-02-21 11 views
6

Potrzebuję wywołać funkcję zewnętrznej biblioteki DLL z kodu Java. Używam Netbeans 7.2. funkcje mojego DLL są:Jak wywołać funkcję dll zewnętrzny z kodu java

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

Obserwuję this przykład. Ale nie wiem, jak deklarują moje funkcje dll. I znalazłem inny link. Ale to nie działa dla mnie.

+6

"To nie działa dla mnie" nie jest * prawie * wystarczającą informacją, abyśmy mogli Ci pomóc. Musisz nam powiedzieć, co próbujesz i jakie były wyniki. Proszę przeczytać http://tinyurl.com/so-list –

+0

Co nie działa?Czy możesz udostępnić kod tego, co próbujesz? –

+0

Dla systemu Linux: http://stackoverflow.com/a/30635871/895245 –

Odpowiedz

2

Trzeba będzie użyć Java Native Interface (JNI), która jest zbiorem C/C++ funkcji, które umożliwiają natywny kod do współpracy z kodu Java (tj otrzymaniu parametrów z wywołań funkcji java, zwracania wyników, itp). Napisz opakowującą bibliotekę C, która odbiera połączenia JNI, a następnie wywołaj bibliotekę zewnętrzną.

Na przykład poniższa funkcja wywołuje metodę updateHandlers na obiekcie natywnym (przechowywanym jako długo po stronie Java).

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); 
} 

Odpowiednie deklaracje w package.ClassName są:

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

zadeklarować swoje natywne funkcje w Java (native private ...) z podpisem, że trzeba; następnie uruchom javah (narzędzie dostarczane wraz z JDK), aby wygenerować natywne nagłówki. A List<String> (a właściwie List, ze względu na usunięcie typu) to jobject w natywnym kodzie.

odpowiedniej metody C, byłoby:

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

Myślę, że łatwiej będzie zwracać tablicę ciągów jobjectArray oraz instancję List w Javie od zwracanych wartości. Zobacz this example.

6

Natknąłem się na ten sam problem z "wywoływaniem DLL z Java" i najpierw byłem sfrustrowany złożonością. Istnieje jednak eleganckie rozwiązanie (może być również interesujące dla osób tam przebywających w środowisku przetwarzania.org). Biorąc pod uwagę raczej "ogólną" formę pytania (być może, nie jest to uzasadnione), przypuszczam, że , wskazane byłoby raczej łatwe rozwiązanie. Innymi słowy, rozwiązanie, które pozwala uniknąć aranżowania plików nagłówkowych, dodatkowych konwersji itp., Tak jak kod źródłowy niekoniecznie jest dostępny.

Moja rekomendacja brzmi: JNA (https://github.com/twall/jna), która w zasadzie jest uproszczeniem dla JNI. Działa wspaniale, mapowanie typów jest proste (na przykład pchar = bufor lpcstr -> string), ale używam go tylko w odniesieniu do bibliotek DLL systemu Windows i moich własnych bibliotek DLL w stylu C utworzonych przy użyciu Delphi-Pascal. Jedyną rzeczą do rozważenia jest to, że zwracane wartości powinny być eksportowane za pośrednictwem funkcji, a nie wychodzących flagowanych zmiennych referencyjnych "out". Pytanie już wskazuje na połączone źródło, które daje na to przykład (więc odpowiedzi na pytania dotyczące JNI mogą być tutaj błędnie umieszczone). Zauważ, że podany przeze mnie link zawiera również aksje do przenoszenia tablic i wskaźników.

Powiązane problemy