2

私は 2 つの DLL を持っています:をエクスポートする directx dll と、同じことを行うopengl dll です。GetNativeBuffer

次の Java クラスを使用して を呼び出しGetNativeBuffer、ロードされた dll からイメージを読み取ります。

class DllLoader {

    private ByteBuffer Buffer = null;
    private BufferedImage Image = null;
    public boolean LibraryLoaded = false;

    private static native void GetNativeBuffer(IntBuffer Buffer);
    private int ByteSize = 0, Width = 0, Height = 0;

    public DllLoader(ByteBuffer Buffer, int ImageWidth, int ImageHeight) {
        this.Buffer = Buffer;
    }
}

問題: 両方の DLL がプログラムによってロードされている場合、どちらから読み込むかを指定するにはどうすればよいですか? 2 つの別々のクラスを作成する必要がありますか? 関数の名前を変更し、2 つのネイティブ関数を用意する必要がありますか?

4

1 に答える 1

2

DLL ごとに 1 つずつ、合計 2 つのクラスを作成する必要があります。Java クラスに同じ名前を付けている場合は、それらを異なるサブパッケージに分ける方が簡単な場合があります。次に例を示します。

package com.stackoverflow.jni.opengl;

/*
 * GENERATE HEADER FILE FROM GENERATED CLASS AS NEEDED VIA
 *   javah com.stackoverflow.jni.opengl.NativeClazz
 */
public class NativeClazz {

/**
 * Load C++ Library
 */
static {
    // Always fun to do this in a static block!
        System.loadLibrary("OpenGL");
}

private static native void GetNativeBuffer(IntBuffer Buffer);
}

package com.stackoverflow.jni.directx;

/*
 * GENERATE HEADER FILE FROM GENERATED CLASS AS NEEDED VIA
 *   javah com.stackoverflow.jni.directx.NativeClazz
 */
public class NativeClazz {

/**
 * Load C++ Library
 */
static {
    // Always fun to do this in a static block!
        System.loadLibrary("DirectX");
}

private static native void GetNativeBuffer(IntBuffer Buffer);
}

私の個人的な好みは、JNI メソッドを含むすべてのクラスを「ユーティリティのみ」(プライベート コンストラクター) に保ち、無駄のない状態 (必要な場合を除き内部変数なし) にして、関数呼び出しパラメーターを介して Bean 内でデータをやり取りすることです。

于 2013-05-06T18:26:32.390 に答える