簡體   English   中英

如何從Java訪問C ++庫(DLL)的方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM