我有两个 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/