2

我有两个 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,我如何指定从哪个 DLL 读取?我必须制作两个单独的课程吗?我是否必须重命名函数并拥有两个本机函数?

4

1 回答 1

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 内来回传输数据。

于 2013-05-06T18:26:32.390 回答