2013-08-02 63 views
0

我有第三方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。进行此调用需要与上面所示不同的界面。

问题

  1. 这甚至可能吗?例如。根据上面的结构,我可以使用JNA从Java调用VB.Net dll。
  2. DllName需要什么结构才能正确映射到类MyClass1MyClass2?这是我的核心问题。
  3. 在上面的DllName.MyClass1调用中,是否有一些替代方法?
  4. 我错过了下面提到的任何替代项目吗?也许我错过了其他解决方案?

我已经探讨了以下方案

  1. 发表this article,但并没有看到我的结构相匹配的例子。我还看了底部引用的单元测试。
  2. 创建一个C++包装器,如这里所建议的/ questions/1556421/use-jni-instead-of-jna-to-call-native-code(我会发布为链接,但没有足够的声誉。 )。我没有真正尝试过,因为我不熟悉C++。当我认为对我的Java代码进行一些更改就足够了时,我会期望得到太多的头撞。
  3. JNI:这看起来好像只适用于C/C++类型的dll。
  4. javOnet:几乎可以工作,但VB.Net方法需要引用字符串,而javOnet目前不支持。我向他们报告了这个问题,我希望有一个解决办法。即使它确实有效,看起来JNA解决方案应该可以工作。该解决方案也存在成本问题。
  5. jni4net:这对我不起作用,因为这是第三方DLL。 jni4net期望.Net端的一些钩子。

请让我知道,如果你想我在这里添加任何额外的颜色。

+0

JNA不打算在这里削减它。由于这可能是导出COM接口,你试过[JACOB](http://sourceforge.net/projects/jacob-project/)吗? –

回答

0

javOnet已经提供了对自ref或1.2版以来通过的参数的支持。你可以读到更多在: http://www.javonet.com/quick-start-guide/#Passing_arguments_by_reference_with_ref_and_out_keywrods

,必须用,因此可以在方法调用中更新你的JAVA变量假设整数将在.NET侧被自动修改你的Java类型中“的AtomicReference”。你可以看到下面的使用范例:

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.