在onSurfaceCreated中加载本机库

时间:2017-04-08 13:51:00

标签: android-ndk opengl-es-2.0

我创建了我的NDK OpenGL ES2应用程序作为教程中的inread我从静态块中的java端加载共享库,就像在渲染器类中一样

static {
    System.loadLibrary("game");
}

但是这会导致错误call to opengl es api with no current context我预计来自c的OpenGL调用发生在曲面创建之前并且openGL上下文变得有效,经过一些谷歌研究并尝试更改c代码但没有成功我放了在onSurfaceCreated内加载函数,然后错误消失了。 我的问题是一个有效的程序,特别是如果C ++库的大小和类增加?如果没有什么是正确的解决方案?

2 个答案:

答案 0 :(得分:0)

load函数不应该驻留在onSurfaceCreated中,静态块是正确的方法。

错误可能是因为您过早地开始与渲染相关的操作 - 这就是为什么将库加载移动到onSurfaceCreated'已解决'你的问题。您需要检查代码并确保在创建表面并开始渲染之前不会执行与opengl相关的代码。

答案 1 :(得分:0)

好的做法是在app start上加载本机库,最好是在后台线程上(因此静态构造函数可能不是调用loadLibrary()的首选位置)。

本机代码可以在JNI_OnLoad()中执行一些初始化,但是还没有开始认真的工作。您应该提供JNI函数(Java native 方法)来开始C ++代码的实际工作。这种架构的好处可能是您可以灵活地将表面或其他系统资源传递给本机代码。

还考虑提供暂停,重启或停止C ++处理的方法。 Android操作系统可以将您的应用推送到后台,然后再将其置于前台;如果资源不足,系统可以随时终止应用程序,但在某些情况下也可以销毁和重新创建表面。您的C ++代码应该可以在所有事件中存活下来。