Java呼び出しダイナミックライブラリ(dll)の最も簡単な方法と最も使いやすいコンポーネント

2521 ワード

以前はJavaがC/C++を呼び出してダイナミックライブラリを書くのにJNI方式を使っていたことを覚えています.また、自分でC/C++コードをたくさん書く必要があります.たとえば、Windowsのuser 32.dllなどの既存のダイナミックライブラリをJavaで呼び出すには、Javaでnativeメソッドを宣言し、javahコマンドでJNIスタイルのヘッダファイルを生成し、ヘッダファイルで宣言するメソッドを自分で実装し、実装メソッドにダイナミックライブラリuser 32.dllをロードし、Message Boxメソッドを呼び出すとします.自分で書いたC/C++コードをSample.dllのようなダイナミックライブラリにカプセル化し、javaで最後に  でSample.dllをロードし、宣言したローカルメソッドを実行します.
正直なJNI方式では、既知のダイナミックライブラリを呼び出すときに、ブリッジとしてJNIルールに合致するダイナミックライブラリを追加生成する必要があり、少し余計に見えます.
次に、オープンソースのコンポーネントJNativeを導入します.http://sourceforge.net/projects/jnative ダウンロード(sourceforgeでjava dllを入力して検索しました)は、既存のダイナミックライブラリのメソッドを呼び出すのに便利です.中間のJNI処理が私たちのために行われているからです.JNativeは現在もBeta 1版で、正式版のリリースを期待しているが、このバージョンに何のBugが登場するかはまだ分からない.
ダウンロードしたjnativeのディレクトリには、JNative.dll,libjnative.so,JNative.jarの3つのファイルが表示されます.
JNative.dll  Windowsプラットフォームで使用する場合は、user.dir、path、system 32、windowsディレクトリなどの対応するlibロードパスにコピーできます.
libnative.soはLinuxプラットフォームの下で使用され、user.dir、pathディレクトリなどの対応するlibロードパスにコピーできます.
JNative.jarこれは私たちがプログラミングするときに使うものです.
ダウンロードしたjnatidveのソースコードにはサンプルコードがあり、orgxvolkstestJNativeTester.javaを見ると、jnativeがダイナミックライブラリメソッドを呼び出す方法がわかります.
コードラインUser 32.messageBox(0,「Demonstrates JNative in action with many Win 32 calls」、「Welcome to JNative」、0)
は呼び出されたクラスUser 32のmessageBoxメソッドであり、messageBoxのコードは

    public static final int messageBox(int parentHandle, String message,
        String caption, int buttons)
        throws NativeException, IllegalAccessException {
    JNative n = null;
    try {
        n = new JNative(DLL_NAME, "MessageBoxA"); //   DLL_NAME   User32.dll
 
                //   JNative     User32.dll,    MessageBoxA  
        n.setRetVal(Type.INT); //          
        int i = 0;
        n.setParameter(i++, Type.INT, "" + parentHandle);
        n.setParameter(i++, Type.STRING, message);
        n.setParameter(i++, Type.STRING, caption);
        n.setParameter(i++, Type.INT, "" + buttons); //             
        n.invoke(); //     
        return Integer.parseInt(n.getRetVal());
    } finally {
        if (n != null)
            n.dispose(); //     
    }
}

上の注釈は私がつけたものです.
TypeにはType.PSTRUCT列挙値というものがあり、C/C++における構造の処理を考慮してJNativeのPointerクラスの例で構造に対応すればよい.orgxvolkstestSNDPTester.javaでは、C/C++の構造に対応するJavaデータ型、つまりJNativeのPointer型をどのようにカプセル化するかを示しています.
また、JNativeでは、列挙、静的導入など、JDK 1.5のいくつかの特性が用いられているため、JDK 1.4では使用できない.