我可以将java窗口句柄传递给OpenGL-es

时间:2013-01-15 08:41:56

标签: java android-ndk java-native-interface opengl-es-2.0

我想开发Java + OpenGL(c版)。

  1. 使用java设计UI。
  2. 使用OpenGL-es(c版)在UI上呈现图像。
  3. 我知道如果我想用Java + C开发,我需要JNI。因为我必须首先创建opengl上下文。此上下文必须与窗口句柄相关。我可以通过JNI将由java创建的窗口句柄传递给OpenGL API。或者使用jogl初始化opengl环境。

1 个答案:

答案 0 :(得分:1)

JNI是在java中运行本机代码的唯一方法,可用于加载特殊生成的共享库(windows中的.dll,linux / android上的.so)并调用在该库中声明的本机函数。如果你想在c中编写你的后端,你必须在c中创建一个共享库,其中包含一些启动代码的功能,比如说:

void init(void)
{
 ...
}

然后是另一个看起来像这样的函数:

void setWindowHandle(void* handle)
{
 ...
}

然后你可以调用第一个函数从java启动你的c代码,并使用你的第二个函数将句柄传递给你的c代码。

除了JNI,它需要导入某些自动生成的头文件,并且要求你在java类型之间来回转换,我强烈建议使用JNA链接到这个共享库。 JNA是一个围绕JNI的包装器API,它处理类型转换,并且不要求你在c中包含任何java环境代码。

最后,为了简化和兼容您的代码,我建议使用JOGL(标准java的opengl绑定)或作为部分提供的java opengl绑定在java中编写opengl接口代码如果这个代码是一个Android设备的android api。您可能认为c更快且应该使用,但就与opengl的接口而言,唯一真正计算密集的代码是由图形卡完成的,而所有opengl接口代码所要做的就是告诉它是什么画画。