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