編集済み質問:Java Native Interface - サードパーティのdllファイルをJavaで使用する
JNAを使用してJavaから.dllファイルを使用しようとしています。私は以下を管理しました:
.dllをシステムライブラリに追加する - System.loadLibrary( "NativeLibrary"); .dll/.hファイル内の関数をマッピングするためのAA NativeInterfaceを作成し
: - 使用してこれを見つけた.dllファイルで、その名前は「マングルさ」であるため、
public interface NativeInterface extends Library, StdCallLibrary {
public int methodA(packageURL.NativeInterface.typeDefName n);
public int methodB();
public static class typeDefName implements Structure.ByReference{
public typeDefName(short s) {}
}
}
は私の関数名へのマッピングを追加しました依存関係ウォーカー
Map options = new HashMap();
options.
put(
Library.OPTION_FUNCTION_MAPPER,
new Mapper() {
public String getFunctionName(NativeLibrary library, Method method) {
return super.getFunctionName(library, method);
}
}
);
AND:
class Mapper implements FunctionMapper{
public String getFunctionName(NativeLibrary library, Method method) {
return "?" + method.getName() + "@@[email protected]@@Z";
}
}
今は(私はよく分からないどのような)どのようにCすることですメソッドAに渡すためにtypeDefNameのオブジェクトを返す
近い、これを使用しましょう、私は今取得しています: ます。java.lang.UnsatisfiedLinkError:? methodA @@ YAHPAEIPAPAXFPAU @@@ Z :エラーは、関数名に変更されている機能methodA 依存関係ウォーカーを使用してを検索します これをマップする必要があるかのように見える/私はmethodAを見たら関数名を変更する?methodA @@ YAHPAEIPAPAXFPAU @@@ Z。何かアドバイス? – Craig
ええ、JNAは本当にC + +のmangled名前を処理しません。サードパーティのクロスランゲージでの再利用を目的としたDLLには一般的にDLLが含まれていませんが、悲しいことですが明らかにそうです。ほとんど成熟していないBridJ(http://code.google.com/p/bridj/)を見ることはできますが、JNAよりもC++をサポートしようとしています。もう一つの選択肢は、実際にはSWIG(http://www.swig.org/)を使ってJavaラッパーを生成することです。 SWIGは優れた製品ですが、生成されたネイティブコードをコンパイルしてライブラリにリンクする必要があるため、JNAほど簡単ではありませんが、C + +コードを自分で書く必要はありません。 –
さらに、FunctionMapperを作成して、getMethodNameを関数が.dllで実際に呼び出されたものに変更しました。 私は関数に渡しているパラメータの1つが好きではありません。 .hファイルのtypedefで定義されています。 – Craig