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