SDL_Activity流程

前言

 

总是会出其不意,讲解随性一些不好吗? 只讲如何使用,明显不是我的风格,于是乎,近期会开展SDL的框架原理的系列分析。当分析做完,给了整体的概念掌握,那么细节就只是时间问题了。
于是,这节开始展开,SDL的java端的代码剖析。

SDLActivity时序图

一张时序图,展开此系列。

 

首先,这里需要默认,你是懂android的开发的,Activity是我们界面展示的主体。
SDL自己帮我们写了它在Android的适配工作。主要完成的是SDLActivty.java 以及SDL_android.c 和 SDL_android_main.c,具体怎么执行的呢,我们详细观察上面的时序图。
前奏

在讲解这个知识之前,我们先来讲一些原理的概念化的东西。我们的android,我们一般运行的是一个apk,而这个apk会在系统里面以一个进程来出现。这个进程里面有个虚拟机,主要解析java的语法,是用c语言实现的。然后我们一般开发语言使用的java,但是我们有时需要混合c c++的代码,如何来做呢?
于是虚拟机实现了一套机制,用c语言在实现类java虚拟机的模型的同时,实现一套java和c语言可以相互调用的规则,我们称之为JNI。于是乎,JNI便是连接java和c语言的桥梁,通过按照JNI的写法,即可完成两者直接的相互调用。
android使用一些组件Activity,server,Broadcast Receiver和Content Provider,来简化我们的开发,让我们在不用关注太多操作系统的概念,快速开发应用程序。

SDLActivity

讲了一些android的概念,SDL需要实现Android移植,那么就需要向android的四个组件对接。这里SDL便实现了一个Activity,来完成Android的主界面的SDL实现。同时因为我们SDL本身使用的是c语言开发的,所以就需要写JNI进行搭桥,来实现JAVA和C直接的调用,数据传递。

时序图细节
1按照Android的Activity生命周期,启动的时候,会走入onCreate
这里首先使用loadLibraries将我们的用SDL开发出来的so库进行加载,so库里面便是我们使用c开发的代码。
2紧接着使用new SDLSurface来实现一个继承了Android本身提供的一种有独立绘制界面的SurfaceView,同时SDLSurface本身注册了按键以及触摸,手柄事件的接收,当接收到事件的时候,使用java的native方法,这些native方法,会在我们的so库中进行查表,默认是根据包名和方法,参数进行匹配的。找到对应的实现,然后会调用这些c方法,这些方法便是SDL适配的android版本。然后我们在c代码中,进行相应SDL提供的事件监测,回调方法,来进行处理事件,如此便完成了SDL的整个调用过程。
3当我们创建一个SurfaceView(SDLSurface),随后系统会触发surfaceCreated 和 surfaceChanged方法,在这里surfaceChanged比较关键,完成了系统当前的默认像素格式,以及view的宽高信息,通过onNativeResize JNI的方式,传给我们的SDL框架。 同时这里做了一个关键的动作,便是我们的SDL用c开发出来的so库,实质是在一个线程里面执行的。这里为new Thread(new SDLMain(), "SDLThread");
4我们关注我们的SDLMain(),它通过直接运行nativeInit这个本地方法。而这个nativeInit的方法在c端的实现是SDL_android_main.c里面的Java_org_libsdl_app_SDLActivity_nativeInit,这里它使用SDL_Android_Init将系统的一些需要注册JNI的方法完成,从而将c和java之间的通信打通,如此完成之后,调用我们的SDL_main 方法,通过重命名,即可完成#define main SDL_main ,我们使用main方法就好了。

整个框架如下



作者:代码GG陆晓明
链接:https://www.jianshu.com/p/067ea8095a5e

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值