我想用 Java + OpenGL(c 版本)进行开发。
- 使用java设计UI。
- 使用 OpenGL-es(c 版本) 在 UI 上渲染图像。
我知道如果我想开发Java + C
,我需要 JNI。因为我必须先创建 opengl 上下文。并且这个上下文必须与一个窗口句柄相关。我可以将由 java 创建的窗口句柄传递给 JNI 的 OpenGL API。或用于jogl
初始化 opengl 环境。
我想用 Java + OpenGL(c 版本)进行开发。
我知道如果我想开发Java + C
,我需要 JNI。因为我必须先创建 opengl 上下文。并且这个上下文必须与一个窗口句柄相关。我可以将由 java 创建的窗口句柄传递给 JNI 的 OpenGL API。或用于jogl
初始化 opengl 环境。
JNI 是在 java 中运行本机代码的唯一方法,可用于加载专门生成的共享库(windows 中的 .dll,linux/android 中的 .so)并调用在该库中声明的本机函数。如果您想用 c 编写后端,则必须在 c 中创建一个共享库,其中包含一些用于启动代码的功能,例如:
void init(void)
{
...
}
然后是另一个看起来像这样的函数:
void setWindowHandle(void* handle)
{
...
}
然后,您可以调用第一个函数从 java 启动您的 c 代码,并使用您的第二个函数将句柄从 java 传递给您的 c 代码。
除了 JNI 需要导入某些自动生成的头文件,并且需要您在 java 类型之间来回切换,我强烈建议使用JNA来链接到这个共享库。JNA 是围绕 JNI 的包装 API,它处理类型转换,并且不需要您在 c.c 中包含任何 java 环境代码。
最后一点,为了代码的简单性和兼容性,我建议使用JOGL(标准 java 的 opengl 绑定)在 java 中编写 opengl 接口代码,或者如果此代码作为 android api 的一部分提供的 java opengl 绑定适用于安卓设备。你可能认为 c 更快,应该使用,但就与 opengl 的接口而言,唯一真正计算密集的代码是由显卡完成的,所有 opengl 接口代码所要做的就是告诉它什么画。