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
オブジェクトは問題なくロードされます。ただし、DllName
dllのクラス、メソッドシグネチャにマップするために本体がどのような構造をとるべきかわかりません。Native
また、オブジェクトを直接ロードする方法で呼び出す方法も見たことがありません。たとえば、次のようにします。
DllName INSTANCE = (DllName)Native.loadLibrary("DllName.MyClass1", DllName.class);
dllUnsatisfiedLinkError
の名前がDllName
. この呼び出しを行うには、上記とは異なるインターフェイスが必要です。
質問:
- これは可能ですか?たとえば、上記の構造が与えられた JNA を使用して、Java から VB.Net dll を呼び出すことはできますか。
- クラスと
DllName
に適切にマップするために必要な構造は何ですか? これが私の中心的な質問です。MyClass1
MyClass2
- 上記の
DllName.MyClass1
呼び出しで、別の方法はありますか? - 以下に記載されている代替アイテムのいずれかで何か見逃していましたか? おそらく私が見逃した他の解決策はありますか?
次の代替案を検討しました。
- この記事を確認しましたが、私の構造に一致する例はありませんでした。また、下部で参照されている単体テストも確認しました。
- ここ/questions/1556421/use-jni-instead-of-jna-to-call-native-codeで提案されているように、C++ラッパーを作成します(リンクとして投稿しますが、SOでの評判は十分ではありません...)。私はC++に慣れていないので、実際にこれを試したことはありません。自分の Java コードを少し変更するだけで十分だと思うと、頭がいっぱいになると思います。
- JNI: これは C/C++ タイプの dll のみのようです。
- javaOnet: ほとんど動作しますが、VB.Net メソッドは参照による文字列を想定しており、これは現在 javaOnet ではサポートされていません。私は彼らに問題を報告しました。修正されることを期待しています。うまくいったとしても、JNAソリューションがうまくいくようです。そのソリューションにはコストの問題もあります。
- jni4net: これはサードパーティの dll であるため、私にはうまくいきません。jni4net は、.Net 側でいくつかのフックを想定しています。
ここに追加の色を追加したい場合はお知らせください。