2012-01-31 4 views
0

編集済み質問: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のオブジェクトを返す

答えて

2

あなたの目標は、Javaから既存のDLLを使用するだけであれば、あなたが使用することができますJNA ネイティブプログラミングをまったく実行しません。 JNAは、サードパーティの共有ライブラリのメソッドに動的にアクセスします。ライブラリを直接使用することもできますし、JNAを使用してJavaで完全なラッパーを作成することもできます。

リンクをクリックすると、下にスクロールしてください。多くのドキュメントやものがありますが、ページの上端はファイルリストで消費されるため、スクロールするまではそれほど役に立ちません。

+0

近い、これを使用しましょう、私は今取得しています: ます。java.lang.UnsatisfiedLinkError:? methodA @@ YAHPAEIPAPAXFPAU @@@ Z :エラーは、関数名に変更されている機能methodA 依存関係ウォーカーを使用してを検索します これをマップする必要があるかのように見える/私はmethodAを見たら関数名を変更する?methodA @@ YAHPAEIPAPAXFPAU @@@ Z。何かアドバイス? – Craig

+1

ええ、JNAは本当にC + +のmangled名前を処理しません。サードパーティのクロスランゲージでの再利用を目的としたDLLには一般的にDLLが含まれていませんが、悲しいことですが明らかにそうです。ほとんど成熟していないBridJ(http://code.google.com/p/bridj/)を見ることはできますが、JNAよりもC++をサポートしようとしています。もう一つの選択肢は、実際にはSWIG(http://www.swig.org/)を使ってJavaラッパーを生成することです。 SWIGは優れた製品ですが、生成されたネイティブコードをコンパイルしてライブラリにリンクする必要があるため、JNAほど簡単ではありませんが、C + +コードを自分で書く必要はありません。 –

+0

さらに、FunctionMapperを作成して、getMethodNameを関数が.dllで実際に呼び出されたものに変更しました。 私は関数に渡しているパラメータの1つが好きではありません。 .hファイルのtypedefで定義されています。 – Craig

1

JNI hereには、いくつかのコード例が含まれています。

しかし、私はまずCやC++でプログラミングすることを奨励します。特に、ポインタのものが必要です。

あなたはDLLファイルを作成する方法は、あなたが、それは前述した本の中でいくつかのために記述されている使用コンパイラに依存

...

関連する問題