繁体   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