Android下基于SDL的位图渲染(二)理论篇
理论篇
上一篇中介绍了如何将SDL2源码应用到Android渲染中,实际上SDL本身提供的android-project实现了基于android的c运行时环境,通过上面实践篇的介绍,就是完成这个环境搭建的过程。
这样就不需要过多关注Android的Activity框架及图像渲染机制。
更加详细关于这部分的介绍建议参考Building SDL2 for Android。
其中最关键的部分在于org.libsdl.app.SDLActivity的实现,当然涉及视频渲染需要SurfaceView支持,所有代码位于SDLActivity.java,SDLSurface就是继承与此。我们的最终的main函数的调用时通过class SDLMain实现的。
其基本调用流程是SDLSurface.surfaceChanged()启动SDLMain线程,SDLMain的线程函数执行SDLActivity的nativeInit()。这样就把java层的代码和渲染工作转交给c/c++层去实现,其他Android事件处理由SDL完成。
我们看下SDLActivity.nativeInit()的代码(位于SDL2-src/src/main/android/SDL_android_main.c中)
#include <jni.h>
/* Called before SDL_main() to initialize JNI bindings in SDL library */
extern void SDL_Android_Init(JNIEnv* env, jclass cls);
/* Start up the SDL app */
JNIEXPORT int JNICALL Java_org_libsdl_app_SDLActivity_nativeInit(JNIEnv* env, jclass cls, jobject array)
{
int i;
int argc;
int status;
/* This interface could expand with ABI negotiation, callbacks, etc. */
SDL_Android_Init(env, cls);
SDL_SetMainReady();
/* Prepare the arguments. */
int len = (*env)->GetArrayLength(env, array);
char* argv[1 + len + 1];
argc = 0;
/* Use the name "app_process" so PHYSFS_platformCalcBaseDir() works.
https://bitbucket.org/MartinFelis/love-android-sdl2/issue/23/release-build-crash-on-start
*/
argv[argc++] = SDL_strdup("app_process");
for (i = 0; i < len; ++i) {
const char* utf;
char* arg = NULL;
jstring string = (*env)->GetObjectArrayElement(env, array, i);
if (string) {
utf = (*env)->GetStringUTFChars(env, string, 0);
if (utf) {
arg = SDL_strdup(utf);
(*env)->ReleaseStringUTFChars(env, string, utf);
}
(*env)->DeleteLocalRef(env, string);
}
if (!arg) {
arg = SDL_strdup("");
}
argv[argc++] = arg;
}
argv[argc] = NULL;
/* Run the application. */
status = SDL_main(argc, argv);
/* Release the arguments. */
for (i = 0; i < argc; ++i) {
SDL_free(argv[i]);
}
/* Do not issue an exit or the whole application will terminate instead of just the SDL thread */
/* exit(status); */
return status;
}
功能很简单,初始化SDL在Android下的参数,获取命令行参数,执行SDL_main()。
也许大家会感觉比较奇怪,在main.c中命名写的main函数啊,SDL_main为何物?
这个问题我也纠结了一段时间,直接找不到SDL_main的实现,哪就源码中全局搜索SDL_main吧。看看结果:
sdl2/CMakeLists.txt:1146: set(SDL_CFLAGS "${SDL_CFLAGS} -Dmain=SDL_main")
sdl2/configure.in:3123: SDL_CFLAGS="$SDL_CFLAGS -Dmain=SDL_main"
其他全是关于SDL_main的调用或者声明,只有这两个靠谱点。查查GCC的命令,-Dmain=SDL_main,这个就是编译的时候定义宏,等价于:
#define SDL_main main
好了,到这里就搞清楚了,SDL2提供的android-project如何把Activity和c的main通过JNI串联起来的。
最后说一点,为什么我们写的c的main函数退出了,对应的Activity也退出了呢?
这就是SDL_Quit通过内部消息机制,主动通知Activity退出的。当然具体的实现可能涉及太多SDL内部的内容,有兴趣的可以直接查看SDL_Quit的实现部分。
关于SDL渲染BMP的原理,我之前写过windows下的使用SDL实现BMP渲染,原理是类似的。这里不赘述了,代码也相对简单。
附加说明
本文主要参考以下部分:
- SDL官网
- windows下的使用SDL实现BMP渲染
- 零基础学习SDL开发之在Android使用SDL2.0显示BMP图这篇文章是基于Eclipse的,条理不是很清楚,让人感觉比较迷糊,本文也是参考这个基础上整理的。
源码下载
本文中涉及所有源码可以从我的git@OSC,下载之后需要切换到bmp_render的tag即可。
Android下基于SDL的位图渲染(二)理论篇的更多相关文章
- Android下基于SDL的位图渲染(一)
环境准备 安装Android开发环境(java.android-sdk.android ndk.gcc). 我使用的ndk版本是r10b/r10d,在win10/ubutu 15.04编译 下载sdl ...
- Android下基于SDL的YUV渲染
实战篇 本文主要参考我之前整理的文章windows下使用SDL进行YUV渲染. 相对于之前写的位图渲染部分(http://www.cnblogs.com/tocy/p/android-sdl-bitm ...
- Android下基于PCM的音频渲染
环境准备 请按照我之前的文章-Android下基于SDL的位图渲染,安装必要的开发环境. 实践篇 这里主要参考Beginning SDL 2.0(6) 音频渲染及wav播放,只不过将源从WAV文件改成 ...
- Android下基于线程池的网络访问基础框架
引言 现在的Android开发很多都使用Volley.OkHttp.Retrofit等框架,这些框架固然有优秀的地方(以后会写代码学习分享),但是我们今天介绍一种基于Java线程池的网络访问框架. 实 ...
- MySQL Performance-Schema(二) 理论篇
MySQL Performance-Schema中总共包含52个表,主要分为几类:Setup表,Instance表,Wait Event表,Stage Event表Statement Event表,C ...
- Android 颜色渲染(四) BitmapShader位图渲染
版权声明:本文为博主原创文章,未经博主允许不得转载. Android 颜色处理(四) BitmapShader位图渲染 public BitmapShader(Bitmap bitmap,Shad ...
- cocos2d-x 2.x.x 新建工程 android下的 org文件夹丢失
cocos2d-x 2.x.x 新建工程之后... 打开android项目..会发现src下没有org文件... 解决方法一: cocos2d-x-2.2.0\cocos2dx\platform\an ...
- Android实训案例(二)——Android下的CMD命令之关机重启以及重启recovery
Android实训案例(二)--Android下的CMD命令之关机重启以及重启recovery Android刚兴起的时候,着实让一些小众软件火了一把,切水果,Tom猫,吹裙子就是其中的代表,当然还有 ...
- Dalvik模式下基于Android运行时类加载的函数dexFindClass脱壳
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78003184 前段时间在看雪论坛发现了<发现一个安卓万能脱壳方法>这篇 ...
随机推荐
- rename系统调用的实现浅析
rename系统调用用于在同一个文件系统中做文件的rename操作.如果源和目的在不同mount点上,rename会返回错误EXDEV. rename系统调用的实现入口在./fs/namei.c中: ...
- Tensorflow异常集锦
一.tensorflow checkpoint报错 在调用tf.train.Saver#save时,如果使用的路径是绝对路径,那么保存的checkpoint里面用的就是绝对路径:如果使用的是相对路径, ...
- Language and Compiler Features Since Delphi 7
from: http://edn.embarcadero.com/cn/article/34324 Language and Compiler Features Since Delphi 7 In ...
- nRF2401A/nRF24L01/nRF24L01+无线模块最常见问题汇集(转)
俗话说:每个人一生下来什么都会的,都是通过自己努力和探索出来的,NRF系列芯片,刚开始都好奇心加兴趣才来捣鼓它的,刚开始做硬件和软件,没有收发数据弄得整个人头都快炸开了,所以在此和大家分享一下前辈的经 ...
- 利用hadoop来解决“共同好友”的问题
假设A有好友B C D:B有好友A C D E:C有好友A B D E:D有好友A B C E;E有好友B C D. A -> B C D B -> A C D E C -> A B ...
- 【MAVEN】搜索错误“Index downloads are disabled,search results may be incomplete”
出现上面这个错误,需要将Maven的索引下载到本地. 应用后,在Window -> Show View -> Other -> Maven -> Maven Repositor ...
- Linux安装ElasticSearch-2.2.0-分词器插件(IK)
1.在gitpub上搜索elasticsearch-analysis,能够看到所有elasticsearch的分词器: 2.安装IK分词器:https://github.com/medcl/elast ...
- Idea集成Lombok代码注释来精简代码
转载http://www.cnblogs.com/holten/p/5729226.html Lombok介绍及使用方法 lombok简介 lombok是暑假来到公司实习的时候发现的一个非常好用的小工 ...
- android View未渲染时获得高度
ViewTreeObserver vto = tv.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutLis ...
- 更改Eclipse下Tomcat的部署目录 ,防止上传的文件是到eclipse的克隆的tomcat上的webapp,而不是tomcat本身的webapp
使用eclipse开发是因为机器不够用myeclipse,eclipse也比myeclipse清爽很多,启动速度也快.这里的搭建开发环境使用: Jdk1.6+Tomcat6+Eclipse JEE, ...