[英]how to access a method of C++ library (DLL) from Java
我有一個用C ++(實際上是Firefox插件xyz.dll)編寫的庫,我需要從Java訪問其方法。
public class AccessLibrary {
public interface Kernel32 extends Library {
public void showVersion();
}
public static void main(String[] args) {
Kernel32 lib = (Kernel32) Native.loadLibrary("xyz.dll", Kernel32.class);
lib.showVersion();
}
}
執行時出現以下錯誤:
java -jar dist/accessLibrary.jar
Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'showVersion': The specified procedure could not be found.
在本機庫源代碼中,方法定義如下:
void CPlugin::showVersion() {
/* ... */
}
我對Java非常陌生。 可能是我缺少基本的東西。 調查了類似的問題,但沒有一個解決我的問題。
忘記提及我正在使用Windows 7 64bit和Java 7。
首先,您不能導出類方法並將其加載到Java中。 該名稱將被修改,而Java將不知道如何正確地調用它。 您需要做的是將其單獨分解為一個單獨的功能。
之后:
如前所述,請確保導出函數。 您可以使用以下兩種方法之一進行導出。 首先要提到的是使用__declspec(dllexport)。 第二種是將其放入def文件。
此外,請確保將其標記為extern“ C”,否則名稱將被篡改。 所有詳細信息在這里: 使用dllexport從DLL導出函數
所以簽名應該是這樣的:
extern "C" __declspec(dllexport) void showVersion () {
}
最后,可以在此處下載Depends工具: http : //www.dependencywalker.com/
我認為您的本機庫需要提供C風格的界面,例如
__declspec( dllexport ) void showVersion() {
/* ... */
}
理想情況下,使用depends.exe
(可通過Windows SDK獲得)查看您的DLL,在那里您將看到您的DLL是否提供了正確的函數導出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.