我需要從Java代碼調用外部DLL庫函數。我使用Netbeans 7.2。 我的DLL的功能是:如何從java代碼調用外部dll函數
Boolean isValid(string word)
List<String> getWords(String word)
我下面this例子。但我不知道如何聲明我的dll函數。 而我發現另一個link。但它不適合我。
我需要從Java代碼調用外部DLL庫函數。我使用Netbeans 7.2。 我的DLL的功能是:如何從java代碼調用外部dll函數
Boolean isValid(string word)
List<String> getWords(String word)
我下面this例子。但我不知道如何聲明我的dll函數。 而我發現另一個link。但它不適合我。
我前段時間寫過樣本教程,也許會有所幫助。
http://wendro.blogspot.com/2010/03/jni-example-eclipse-dev-cpp.html
這是一個僅供鏈接的答案,一般來說這是不可接受的。 – Jashaszun 2017-07-23 16:27:51
你將需要使用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
}
您在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。
我偶然發現了「從Java調用DLL」的相同問題,並首先對複雜性感到沮喪。然而,有一個優雅的解決方案(對於那些位於processing.org棲息地的人來說也可能是有趣的。) 考慮到問題的相當「一般」形式(也許降價並不合理),我想,會指出一個相當容易的解決方案。換句話說,這個解決方案避免了使用頭文件混亂aronud,額外的轉換等等,就像源代碼不一定可用一樣。
我的建議是JNA(https://github.com/twall/jna),它基本上是JNI的簡化包裝。它工作的很好,類型映射是直截了當的(例如,pchar = lpcstr buffer - > string),儘管我只將它用於Windows DLL和使用Delphi-Pascal創建的我自己的C風格的DLL。唯一要考慮的是返回值應該通過函數輸出,而不是「輸出」標記的參考變量。 這個問題已經指出了一個鏈接的源代碼,爲此提供了一個例子(所以,JNI周圍的答案可能在這裏放錯了位置)。請注意,我提供的鏈接還包含用於傳輸數組和指針的axamples。
「它對我不起作用」不足以提供足夠的信息幫助我們。你需要告訴我們你試過了什麼,結果是什麼。請閱讀http://tinyurl.com/so-list – 2013-02-21 08:09:08
什麼是行不通的?你能分享一些你試過的代碼嗎? – 2013-02-21 08:09:13
對於Linux:http://stackoverflow.com/a/30635871/895245 – 2015-06-04 06:06:07