0

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オブジェクトは問題なくロードされます。ただし、DllNamedllのクラス、メソッドシグネチャにマップするために本体がどのような構造をとるべきかわかりません。Nativeまた、オブジェクトを直接ロードする方法で呼び出す方法も見たことがありません。たとえば、次のようにします。

DllName INSTANCE = (DllName)Native.loadLibrary("DllName.MyClass1", DllName.class);

dllUnsatisfiedLinkErrorの名前がDllName. この呼び出しを行うには、上記とは異なるインターフェイスが必要です。

質問:

  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. javaOnet: ほとんど動作しますが、VB.Net メソッドは参照による文字列を想定しており、これは現在 javaOnet ではサポートされていません。私は彼らに問題を報告しました。修正されることを期待しています。うまくいったとしても、JNAソリューションがうまくいくようです。そのソリューションにはコストの問題もあります。
  5. jni4net: これはサードパーティの dll であるため、私にはうまくいきません。jni4net は、.Net 側でいくつかのフックを想定しています。

ここに追加の色を追加したい場合はお知らせください。

4

1 に答える 1

0

javaOnet は、バージョン 1.2 以降、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.
于 2014-04-10T12:35:25.487 に答える