使用类和子函数从Java和JNA调用VB.Net dll

使用类和子函数从Java和JNA调用VB.Net dll,java,vb.net,dll,jna,Java,Vb.net,Dll,Jna,我有一个第三方VB.NETDLL,我想从Java调用它 VB.Net dll具有以下签名(伪代码,但感觉像Java…): 注意:StringRef是我表示该方法希望我通过引用传入字符串的方式 我试图从Java内部调用这个dll对象。使用JNA,我有以下几点: import com.sun.jna.Library; import com.sun.jna.Native; public interface DllName extends Library { DllName INSTANCE

我有一个第三方VB.NETDLL,我想从Java调用它

VB.Net dll具有以下签名(伪代码,但感觉像Java…):

注意:
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);
    }
}
这里的
实例
对象加载得很好。但是,我无法确定
DllName
的主体应该采用什么结构来映射到dll的类,即方法签名。此外,我还没有看到如何以直接加载对象的方式调用
Native
。例如,如果我这样做:

DllName INSTANCE = (DllName)Native.loadLibrary("DllName.MyClass1", DllName.class);
这会导致
未满足的链接错误
,因为dll名为
DllName
。进行此调用需要与上面所示不同的接口

问题:

  • 这可能吗?例如,在给定上述结构的情况下,我可以使用JNA从Java调用VB.Net dll吗
  • DllName
    需要什么结构才能正确映射到类
    MyClass1
    MyClass2
    ?这是我的核心问题
  • 在上面的
    DllName.MyClass1
    调用中,是否有其他方法
  • 我是否遗漏了以下提到的任何替代项目?也许我错过了别的解决办法
  • 我探讨了以下备选方案:

  • 已审阅,但未看到与我的结构匹配的示例。我还查看了底部引用的单元测试
  • 创建一个C++包装器,如这里建议的/问题/ 1556421 /使用JNI而不是JNA调用本地代码(我将作为一个链接发布,但没有足够的信誉与……)。我还没有尝试过,因为我不熟悉C++。当我认为对我的Java代码进行一些更改就足够时,我会期待太多的头痛
  • JNI:这似乎只适用于C/C++类型的DLL
  • javOnet:几乎可以工作,但是VB.Net方法需要引用字符串,这是javOnet目前不支持的。我向他们报告了这个问题,我希望得到解决。即使它确实有效,JNA解决方案似乎也应该有效。该解决方案还存在成本问题
  • jni4net:这对我不起作用,因为这是第三方dll。jni4net希望.Net端有一些钩子

  • 如果您希望我在此处添加任何其他颜色,请告诉我。

    自1.2版以来,javOnet已经为通过ref或out传递的参数提供了支持。您可以在以下网址阅读更多内容:

    您必须在“AtomicReference”中包装您的JAVA类型,以便它可以在方法调用中更新,并且您的JAVA变量(比如说integer)将在.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.
    
    NObject refEx=Javonet.New(“RefExample”);
    //在AtomicReference中包装Java整数以允许按引用传递
    原子参考myInt=新的原子参考(10);
    调用(“方法”,新的NRef(myInt));
    System.out.println(myInt.get());
    //输出将显示数字“55”,因为通过引用传递的int已在方法体中修改。
    
    JNA不会在这里削减成本。由于这可能是导出COM接口,您尝试过吗?
    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.