前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SDL系列讲解(六) SDL_Activity流程

SDL系列讲解(六) SDL_Activity流程

作者头像
用户1263308
发布2018-02-02 11:00:41
1.4K0
发布2018-02-02 11:00:41
举报
文章被收录于专栏:代码GG之家代码GG之家

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方法就好了。

整个框架如下

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 代码GG之家 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • SDLActivity时序图
  • 前奏
  • SDLActivity
  • 时序图细节
  • 整个框架如下
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档