JNI从两个DLL读取一个类

时间:2013-05-06 16:02:15

标签: java java-native-interface

我有两个DLL:一个 directx dll,它导出GetNativeBuffer,一个 opengl dll,它们也是这样做的。

我使用以下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,我该如何指定读取哪个?  我必须分两个班吗?我是否必须重命名函数并具有两个本机函数?

1 个答案:

答案 0 :(得分:2)

你应该创建两个类,每个DLL一个。如果要以相同的方式命名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内来回传输数据。 / p>