android中使用sdl时先退出(sdl_thread未关闭)再进入出错

编者:李国帅

qq:9611153 微信lgs9611153

时间:2014/2/17 

背景:

在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无法退出,后面再进入出错。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微澜-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值