背景:
在android上使用sdl进行媒体播放会遇到后退停止的问题。
问题描述:
在开发的时候,出现第二次调用sdl显示失败
libEGL: call to OpenGL ES API with no current context (logged once per thread)
可能的原因:OGL ES所在的线程被阻塞或者被挂起,导致渲染设备上下文丢失。
暂时不清楚怎么解决,需要进一步的了解sdl和opengl的操作方法,自己对sdl了解不够才会出现这样的问题。
通过测试,即便是最简单的android程序,使用adb进行调试,在设备上使用后退键关闭程序,davikVM实例是不会停止的,如果重新执行,使用的还是同一个davikVM实例,是不是当前android实例已经关闭,仅仅是虚拟机没有关闭而已?
继续测试发现是sdl的c语言调用部分出现了问题,而不出在surfaceview部分。不过还是应该更多的学习android编程知识。
问题出现在
void Java_org_libsdl_app_SDLActivity_nativePause(
JNIEnv* env, jclass cls)
{
if (Android_Window) {
/* Signal the pause semaphore so the event loop knows to pause and (optionally) block itself */
if (!SDL_SemValue(Android_PauseSem)) SDL_SemPost(Android_PauseSem);//真正问题是这几句
SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_FOCUS_LOST, 0, 0);//真正问题是这几句
SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_MINIMIZED, 0, 0);//真正问题是这几句
}
__android_log_print(ANDROID_LOG_VERBOSE, "SDL", "nativePause()");
SDL_SendAppEvent(SDL_APP_WILLENTERBACKGROUND);
SDL_SendAppEvent(SDL_APP_DIDENTERBACKGROUND);
__android_log_print(ANDROID_LOG_VERBOSE, "SDL", "nativePause() end");
}
和原程序的主要区别是接收key事件,然后把SDL thread线程关闭掉,然后才去调用onpause事件。而我的程序没有激发key事件,所以无法退出。
02-19 14:59:44.900: I/SDL/APP(8629): SDL_WINDOWEVENT_SIZE_CHANGED
02-19 14:59:50.420: I/SDL/APP(8629): exit for SDL_KEYDOWN
02-19 14:59:50.420: I/SDL/APP(8629): exit for done
02-19 14:59:50.420: V/SDL(8629): SDL thread terminated
02-19 14:59:50.660: V/SDL(8629): onPause()
如下更改之后,就不会出现sdl线程无法退出的问题,sdl内部逻辑是没有错误的。
public class SDLActivity extends Activity implements SurfaceHolder.Callback,
View.OnKeyListener
protected void onCreate(Bundle savedInstanceState)
mSurface = (SurfaceView) this.findViewById(R.id.surface_play);
mSurface.setOnKeyListener(this);
// Key events
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
Log.v("SDL", "key down: " + keyCode);
SDLActivity.onNativeKeyDown(keyCode);
return true;
} else if (event.getAction() == KeyEvent.ACTION_UP) {
Log.v("SDL", "key up: " + keyCode);
SDLActivity.onNativeKeyUp(keyCode);
return true;
}
return false;
}
总结:
看来对于pc机,android设备等移动设备有自身的一些特征,比如按键不同,只有home,back,min,max等少数键,以及触摸屏控制,重力感应器等事件触发机制。这些东西需要在以后的应用中逐步的熟悉。
真正的原因是:前一次sdl_thread无法退出,后面再进入出错。