簡體   English   中英

使用 Java 進程通過 JNA 從具有大量類的非常復雜的 C++ Win32 DLL 調用方法

[英]Call methods from a very complicated C++ Win32 DLL with tons of classes by Java process via JNA

我有一個由其他部門的開發人員用 C++ 為 Win32 編寫的非常復雜和大的 DLL,需要由我的 java 進程使用。 我擁有的:

限制:我不允許(盡管我有一個 .sol 文件)對該 DLL 進行任何更改。

目標:我希望我的 java 進程能夠從這個 DLL 調用一些方法。

儀器:首先我想用 JNA(第二個是 JNI)來嘗試。

問題:

我閱讀了一些關於 JNA 的一般信息並了解到,首先要構建要在接口中調用的方法的原型。 好的,現在的問題是:我要調用的方法,以DLL項目中的自定義對象作為參數。 例如,我在 DLL 中有一個函數,如:

__declspec(dllexport) BOOL WINAPI NiceFunction( 
          Dummy_State *ModuleState, Dummy_Handle Handle, Dummy_Exception &Exception,
          LPCTSTR name, DWORD timer);

其中所有Dummy_對象都屬於在此 DLL 中定義的類。

問題1:如何在我的java進程中用JNA調用這樣的函數?

問題 2:是否可以在我的 Java 進程中以某種方式直接使用這些對象? 也許以某種方式導入構造函數? 然而,這些對象的構造函數經常需要調用父類的構造函數。

問題 3:最后但並非最不重要的一點是,我的 DLL 還調用了兩個額外的 DLL 並廣泛使用了它們的數據(一些Dummy_對象)。 我是否還需要通過 JNA 在我的 java 進程中導入(以某種方式)它們?

JNA 僅適用於 C 函數,不適用於 C++。 您將能夠映射的唯一 C++ 函數必須已使用extern "C"進行了外部化。 如果不是,並且您無法更改 DLL,則您可能必須編寫自己的 DLL 包裝器,該包裝器具有extern "C"版本。

如何使用 JNA 調用此類函數:

您必須將它們映射到 Java 接口。 例如:

public interface ComplicatedAndBigLibrary {
    // Create an instance to access the mapped functions with
    // the String in quotes is the filename, minus .dll
    ComplicatedAndBigLibrary INSTANCE = 
        (ComplicatedAndBigLibrary) Native.load("compbiglib", W32APIOptions.DEFAULT_OPTIONS);

    // Map the C structures or typedefs
    // Use "extends" as needed for parents
    @FieldOrder({"field1", "field2"})
    class Dummy_State extends Structure {
        // map structure fields here
        public int field1;
        public byte field2;
    }

    class Dummy_Handle extends WinNT.HANDLE {
        // any overrides you need
    }

    // Map your functions (that were externalized)
    boolean NiceFunction( 
          Dummy_State ModuleState, Dummy_Handle Handle, Dummy_Exception ExceptionPointer,
          LPCTSTR name, DWORD timer);
}

查看com.sun.jna.platform.win32中的 JNA 源代碼,了解許多基於 Windows DLL 的示例。 您基本上是在為您的 DLL 做同樣的事情。

在我的 java 進程中以某種方式直接使用這些對象

ComplicatedAndBigLibrary CABL = ComplicatedAndBigLibrary.INSTANCE;
CABL.NiceFunction(foo, bar, ...)

也稱為兩個額外的 DLL 並廣泛使用它們的數據

您需要類似地映射其他 DLL(創建一個接口,使用Native.load()並映射函數/常量/等)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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