簡體   English   中英

使用JNA從Java調用帶有類和子功能的VB.Net dll

[英]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 進行此調用所需的接口與上面顯示的接口不同。

問題

  1. 這有可能嗎? 例如,根據上述結構,我可以使用JNA從Java調用VB.Net dll嗎?
  2. DllName必須具有什么結構才能正確映射到類MyClass1MyClass2 這是我的核心問題。
  3. 在上面的DllName.MyClass1調用中,是否有其他替代方法?
  4. 我是否會錯過以下提及的其他替代品? 也許我錯過了其他解決方案?

我探索了以下替代方案

  1. 閱讀了本文 ,但沒有看到符合我的結構的示例。 我還查看了底部引用的單元測試。
  2. 按照此處的建議/ questions / 1556421 / use-jni-instead-of-jna-to-call-native-code的建議創建一個C ++包裝器(我將其發布為鏈接,但在SO中的聲譽不高...)。 我實際上還沒有嘗試過,因為我不熟悉C ++。 當我認為對Java代碼進行一些更改就足夠了時,我會感到頭疼。
  3. JNI:這似乎僅適用於C / C ++類型的dll。
  4. javOnet:幾乎可以使用,但是VB.Net方法希望通過引用來獲取字符串,而javOnet目前不支持。 我向他們報告了該問題,希望得到修復。 即使它確實起作用,似乎JNA解決方案也應該起作用。 該解決方案也存在成本問題。
  5. jni4net:這對我不起作用,因為這是第三方dll。 jni4net希望在.Net方面有所了解。

如果您要我在此處添加其他顏色,請告訴我。

自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.

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