我有第三方VB.Net DLL,我想来自Java的调用。从Java与JNA呼叫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);
这导致UnsatisfiedLinkError
因为该dll被命名为DllName
。进行此调用需要与上面所示不同的界面。
问题:
- 这甚至可能吗?例如。根据上面的结构,我可以使用JNA从Java调用VB.Net dll。
DllName
需要什么结构才能正确映射到类MyClass1
和MyClass2
?这是我的核心问题。- 在上面的
DllName.MyClass1
调用中,是否有一些替代方法? - 我错过了下面提到的任何替代项目吗?也许我错过了其他解决方案?
我已经探讨了以下方案:
- 发表this article,但并没有看到我的结构相匹配的例子。我还看了底部引用的单元测试。
- 创建一个C++包装器,如这里所建议的/ questions/1556421/use-jni-instead-of-jna-to-call-native-code(我会发布为链接,但没有足够的声誉。 )。我没有真正尝试过,因为我不熟悉C++。当我认为对我的Java代码进行一些更改就足够了时,我会期望得到太多的头撞。
- JNI:这看起来好像只适用于C/C++类型的dll。
- javOnet:几乎可以工作,但VB.Net方法需要引用字符串,而javOnet目前不支持。我向他们报告了这个问题,我希望有一个解决办法。即使它确实有效,看起来JNA解决方案应该可以工作。该解决方案也存在成本问题。
- jni4net:这对我不起作用,因为这是第三方DLL。 jni4net期望.Net端的一些钩子。
请让我知道,如果你想我在这里添加任何额外的颜色。
JNA不打算在这里削减它。由于这可能是导出COM接口,你试过[JACOB](http://sourceforge.net/projects/jacob-project/)吗? –