我有一个第三方VB.Net dll ,我想从Java调用。
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);
这导致UnsatisfiedLinkError
,因为dll名为DllName
。拨打此电话需要与上面显示的界面不同。
问题:
DllName
需要哪种结构才能正确映射到班级MyClass1
和MyClass2
?这是我的核心问题。DllName.MyClass1
调用中,是否有其他替代方式?我已经探索了以下替代方案:
如果您希望我在此处添加任何其他颜色,请与我们联系。
答案 0 :(得分:0)
javOnet已经为自1.2版本以来ref或out传递的参数提供了支持。您可以在以下网址阅读更多 http://www.javonet.com/quick-start-guide/#Passing_arguments_by_reference_with_ref_and_out_keywrods
你必须在“AtomicReference”中包装你的JAVA类型,以便它可以在方法调用中更新,你的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.