微信号:code_gg_home

介绍:分享技术干货,分享最新新闻动态,分享开心段子,让大家轻松愉快的成长.

SDL系列讲解(六) SDL_Activity流程

2017-10-13 00:00 陆晓明



SDL系列讲解(一)  简介

SDL系列讲解(二) 环境搭建

SDL系列讲解(三) 工具安装

SDL是什么,能干什么,为什么我们要学习它?

SDL系列讲解(四) demo讲解

SDL系列讲解(五) 调试c代码

前言


总是会出其不意,讲解随性一些不好吗? 只讲如何使用,明显不是我的风格,于是乎,近期会开展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之家 更多文章 SDL系列讲解(五) 调试c代码 SDL系列讲解(四) demo讲解 SDL是什么,能干什么,为什么我们要学习它? 如何快速掌握一门新的技术? SDL系列讲解(三) 工具安装
猜您喜欢 老系统头尾统一改造所带来的端适配解决方案 当这个年龄的你还在玩王者荣耀时,这群人已经当上了黑客 Facebook POP,迈向大师操作之路 0428java基础班经验交流会 Python无参装饰器