使用类和子函数从Java和JNA调用VB.Net dll
我有一个第三方VB.NETDLL,我想从Java调用它 VB.Net dll具有以下签名(伪代码,但感觉像Java…): 注意:使用类和子函数从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
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
。进行此调用需要与上面所示不同的接口
问题:
DllName
需要什么结构才能正确映射到类MyClass1
和MyClass2
?这是我的核心问题DllName.MyClass1
调用中,是否有其他方法如果您希望我在此处添加任何其他颜色,请告诉我。自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.