2013-02-21 53 views
6

我需要從Java代碼調用外部DLL庫函數。我使用Netbeans 7.2。 我的DLL的功能是:如何從java代碼調用外部dll函數

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

我下面this例子。但我不知道如何聲明我的dll函數。 而我發現另一個link。但它不適合我。

+6

「它對我不起作用」不足以提供足夠的信息幫助我們。你需要告訴我們你試過了什麼,結果是什麼。請閱讀http://tinyurl.com/so-list – 2013-02-21 08:09:08

+0

什麼是行不通的?你能分享一些你試過的代碼嗎? – 2013-02-21 08:09:13

+0

對於Linux:http://stackoverflow.com/a/30635871/895245 – 2015-06-04 06:06:07

回答

2

你將需要使用Java Native Interface (JNI),這是一組C/C++函數,允許本地代碼和Java代碼界面(即接收從Java函數調用的參數,返回結果等)。編寫一個接收JNI調用的包裝器C庫,然後調用你的外部庫。例如,以下函數在本地對象(在Java端存儲的時間長度)上調用方法updateHandlers

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

在package.ClassName相應的聲明是:

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

您在Java(native private ...)與您所需要的簽名聲明本機的功能;然後運行javah(JDK提供的工具)以生成本機標頭。 A List<String>(實際上是List,由於類型擦除)是本機代碼中的jobject

相應的C方法,將是:

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

我認爲這將是更容易從返回的值返回字符串jobjectArray數組,並實例化列表中的Java。見this example

6

我偶然發現了「從Java調用DLL」的相同問題,並首先對複雜性感到沮喪。然而,有一個優雅的解決方案(對於那些位於processing.org棲息地的人來說也可能是有趣的。) 考慮到問題的相當「一般」形式(也許降價並不合理),我想,會指出一個相當容易的解決方案。換句話說,這個解決方案避免了使用頭文件混亂aronud,額外的轉換等等,就像源代碼不一定可用一樣。

我的建議是JNA(https://github.com/twall/jna),它基本上是JNI的簡化包裝。它工作的很好,類型映射是直截了當的(例如,pchar = lpcstr buffer - > string),儘管我只將它用於Windows DLL和使用Delphi-Pascal創建的我自己的C風格的DLL。唯一要考慮的是返回值應該通過函數輸出,而不是「輸出」標記的參考變量。 這個問題已經指出了一個鏈接的源代碼,爲此提供了一個例子(所以,JNI周圍的答案可能在這裏放錯了位置)。請注意,我提供的鏈接還包含用於傳輸數組和指針的axamples。

相關問題