Android下基于SDL的位图渲染(一)
2016-04-10 21:36
357 查看
环境准备
安装Android开发环境(java、android-sdk、android ndk、gcc)。我使用的ndk版本是r10b/r10d,在win10/ubutu 15.04编译
下载sdl2源码 www.libsdl.org (我下载的是sdl2-2.0.4)
实际程序运行时会读取
/sdcard/hello_world.bmp,所以麻烦下载一种位图放到测试设备指定位置。
开始前说明
本文不会过度关注Android应用层的框架,主要目标是说明如何用SDL实现图像渲染。如果读者希望深入了解下SDL如何将Java层的Activity和C/C++的main函数关联起来并运行的,建议先学习下Activity机制、JNI调用、SurfaceView等基础知识。
这里不会介绍Android IDE的使用,有兴趣的可以查找相关资料(Eclipse、Android Studio),本文仅使用命令行直接调用sdk、ndk的编译命令。
实战篇
1. 将下载的SDL源码解压,并将其中的android-project目录拷贝到独立的目录,修改目录名称为Android-SDLv2。
2. 将第一步解码的SDL源码放到Android-SDLv2/jni/目录下,修改其名称为sdl2。
3. 删除Android-SDLv2/jni/目录下的src目录,并在jni下新建main目录,并添加如下三个文件:
main.c#include "SDL.h" int bmp_main(int argc, char *argv[]); int main(int argc, char *argv[]) { return bmp_main(argc, argv); }
as_lesson_bmp.c
#define LOG_TAG "as_lesson" #include <android/log.h> #include "SDL.h" #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__) #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , LOG_TAG, __VA_ARGS__) #define LOGI(...) __android_log_print(ANDROID_LOG_INFO , LOG_TAG, __VA_ARGS__) #define LOGW(...) __android_log_print(ANDROID_LOG_WARN , LOG_TAG, __VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , LOG_TAG, __VA_ARGS__) //The attributes of the screen const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; const int SCREEN_BPP = 32; int bmp_main(int argc, char *argv[]) { char *filepath = "/sdcard/hello_world.bmp"; LOGI("natvie_SDL %s", filepath); if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER) == -1) { LOGE("SDL_Init failed %s", SDL_GetError()); return -1; } LOGI("SDL_CreateWindow"); SDL_Window * window = SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN); if (window == NULL) { LOGE("SDL_CreateWindow failed %s", SDL_GetError()); } LOGI("SDL_CreateRenderer"); SDL_Renderer * render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (render == NULL) { LOGE("SDL_CreateRenderer failed %s", SDL_GetError()); } SDL_Surface * bmp = SDL_LoadBMP(filepath); if (bmp == NULL) { LOGE("SDL_LoadBMP failed: %s", SDL_GetError()); } SDL_Texture * texture = SDL_CreateTextureFromSurface(render, bmp); SDL_RenderClear(render); SDL_RenderCopy(render, texture, NULL, NULL); SDL_RenderPresent(render); SDL_Delay(2000); SDL_FreeSurface(bmp); SDL_DestroyTexture(texture); SDL_DestroyRenderer(render); SDL_DestroyWindow(window); //Quit SDL SDL_Quit(); return 0; }
Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := main # define our SDL_ROOT path SDL_ROOT := ../sdl2 LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_ROOT)/include # Add your application source files here... LOCAL_SRC_FILES := as_lesson_bmp.c main.c\ $(SDL_ROOT)/src/main/android/SDL_android_main.c #LOCAL_STATIC_LIBRARIES := libc LOCAL_SHARED_LIBRARIES += SDL2 LOCAL_LDLIBS := -llog -lGLESv1_CM -lGLESv2 include $(BUILD_SHARED_LIBRARY)
4. 修改Android-SDLv2/jni下的Application.mk,具体内容如下:
# Uncomment this if you're using STL in your project # See CPLUSPLUS-SUPPORT.html in the NDK documentation for more information # APP_STL := stlport_static APP_ABI := armeabi-v7a APP_PLATFORM = android-19
5. 编译动态库及生成apk
首先生成动态库,进入Android-SDLv2/jni,执行下面命令:$ ndk-build
执行完成后进入Android-SDLv2目录,执行下面命令,用于生成apk
$ android update project -p . -s --target android-19
$ ant debug
以上两个命令如果没有任何错误的话,在Android-SDLv2/bin目录下会看到生成的apk文件(SDLActivity-debug.apk)。
6. 安装apk并运行。
源码下载
本文中涉及所有源码可以从我的git@OSC,下载之后需要切换到bmp_render的tag即可。相关文章推荐
- Android学习(13) -- Android中对内部存储操作说明
- Android 内存泄漏总结
- Android之ListView的使用
- Android线程池使用
- 解决win和ubuntu12.10下adb devices 无法检测android手机问题
- Android 博客周刊13期
- Android学习(19) -- 数据存储之File (简单登录保存用户名和密码)
- Android实现 画几何图形总结
- Android 开发常见问题汇总
- Android完全退出应用程序
- 使用字符串资源
- 提高你使用android studio的效率之键盘篇
- android自定义view属性
- TextView高级使用:SpannableString
- android自定义view
- Android开发学习之路-Android Studio真神器!
- android 布局属性(alignBaseLine在最后有详细解释)
- Android 联系人数据库介绍以及对联系人的基本操作
- Android选择通讯录姓名和手机号信息
- RxAndroid项目实践-使用RxJava响应式编码实现知乎日报的欢迎界面