java - JNI 从一个类的两个 DLL 中读取

标签 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,我如何指定读取哪一个? 我必须上两门单独的课吗?我是否必须重命名函数并拥有两个 native 函数?

最佳答案

您应该创建两个类,每个类对应一个 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 方法的类保持“仅限实用程序”(私有(private)构造函数),使它们精简且简单(除非必要,否则没有内部变量),并通过函数调用参数在 bean 内来回传输数据。

关于java - JNI 从一个类的两个 DLL 中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16402581/

相关文章:

java - 无法从java程序: Unable to relay for abc@wipro. com发送电子邮件

java - JNI中如何释放返回的对象?

java - 如何获得计算机的唯一标识符?

java - 从 C 代码设置/获取 Java List<>

java - JNI 到 Java 异常中的 NoSuchMethodError

java - Eclipse Web 服务资源管理器如何工作?

java - Struts2 中 ModelDriven Action 的继承

java - 如果方法仅访问线程安全对象,它在 Java 中是否是线程安全的?

java - Red5的视频录制质量很糟糕

android - Android JNI 中的计时器