[英]How to access classes and methods of vb.net native dll file from jna or other library
[英]Call VB.Net dll with classes and subfunctions, from Java with JNA
我有一個想從Java調用 的第三方VB.Net dll 。
VB.Net dll具有以下簽名(偽代碼,但感覺像Java ...):
class MyClass1 {
public Object method1(StringRef arg1, StringRef arg2) {
// do something here...
return someResult;
}
}
class MyClass2 {
public Object method2(StringRef arg1, StringRef arg2) {
// do something here...
return someOtherResult;
}
}
注意: StringRef
是我說方法希望我通過引用傳遞字符串的方式。
我試圖從Java內部調用此dll對象。 使用JNA,我有以下內容:
import com.sun.jna.Library;
import com.sun.jna.Native;
public interface DllName extends Library {
DllName INSTANCE = (DllName)Native.loadLibrary("DllName", DllName.class);
public static interface MyClass1 {
public Object method1(String arg1, String arg2);
}
public static interface MyClass2 {
public Object method2(String arg1, String arg2);
}
}
這里的INSTANCE
對象可以很好地加載。 但是,我無法弄清楚DllName
主體應采用什么結構來映射到dll的類,方法簽名。 另外,我還沒有看到如何直接加載對象的方式調用Native
。 例如,如果我這樣做:
DllName INSTANCE = (DllName)Native.loadLibrary("DllName.MyClass1", DllName.class);
由於dll名為DllName
因此將導致UnsatisfiedLinkError
。 進行此調用所需的接口與上面顯示的接口不同。
問題 :
DllName
必須具有什么結構才能正確映射到類MyClass1
和MyClass2
? 這是我的核心問題。 DllName.MyClass1
調用中,是否有其他替代方法? 我探索了以下替代方案 :
如果您要我在此處添加其他顏色,請告訴我。
自1.2版以來,javOnet已經支持通過ref或out傳遞的參數。 您可以在以下位置閱讀更多信息: http : //www.javonet.com/quick-start-guide/#Passing_arguments_by_reference_with_ref_and_out_keywrods
您必須將JAVA類型包裝在“ AtomicReference”中,以便可以在方法調用中進行更新,並且您的JAVA變量(例如,整數)將在.NET端自動進行修改。 您可以在下面看到用法示例:
NObject refEx = Javonet.New("RefExample");
//Wrap Java integer in AtomicReference to allow passing by reference
AtomicReference<Integer> myInt = new AtomicReference<Integer>(10);
refEx.invoke("Method",new NRef(myInt));
System.out.println(myInt.get());
//Output will display number "55" because int passed by reference has been modified within the method body.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.