环境准备

  1. 安装Android开发环境(java、android-sdk、android ndk、gcc)。
    我使用的ndk版本是r10b/r10d,在win10/ubutu 15.04编译
  2. 下载sdl2源码 www.libsdl.org (我下载的是sdl2-2.0.4)
  3. 实际程序运行时会读取/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 SDLSDL_Quit(); return 0;
}
  • Android.mk
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := main# define our SDL_ROOT path
SDL_ROOT := ../sdl2LOCAL_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 += SDL2LOCAL_LDLIBS := -llog -lGLESv1_CM -lGLESv2include $(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下基于SDL的位图渲染(一)相关推荐

  1. Linux下基于SDL库贪吃蛇游戏

    Linux下基于SDL库贪吃蛇游戏   SDL(Simple DirectMediaLayer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成.SDL提供了数种控制图像.声音.输出入的函数,让开 ...

  2. Android下基于XML的Graphics shape的高级UI设计,定义圆角背景等

    大家很多人都用过新浪微博android客户端,感觉它的UI实在做到很精致,昨天晚上熬夜研究了新浪微博的UI相关的代码,于是有了下面这个文章. 以前的UI设计一般有两种方式,首先是UI把图形设计好,分解 ...

  3. Android下基于线程池的网络访问基础框架

    引言 现在的Android开发很多都使用Volley.OkHttp.Retrofit等框架,这些框架固然有优秀的地方(以后会写代码学习分享),但是我们今天介绍一种基于Java线程池的网络访问框架. 实 ...

  4. android平台下基于ANativeWindow实现渲染bitmap图像

    OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...

  5. Linux下V4L2框架基于SDL库本地USB摄像头监控

    Linux下V4L2框架基于SDL库本地USB摄像头监控 1.摄像头框架编程步骤 (1)打开摄像头设备(/dev/video0 ./dev/video1 ) (2)设置图像格式:VIDIOC_S_FM ...

  6. 【Android 应用开发】Paint 渲染 之 BitmapShader 位图渲染 ( 渲染流程 | CLAMP 拉伸最后像素 | REPEAT 重复绘制图片 | MIRROR 绘制反向图片 )

    文章目录 1. 位图渲染 BitmapShader 简介 ( 1 ) 位图渲染综述 ( ① 三种方式 : Shader.TileMode.CLAMP | Shader.TileMode.REPEAT ...

  7. android sdl,Android下SDL2实现五子棋游戏

    本文实例介绍了Android下用SDL2实现一个简单的五子棋游戏,分享给大家供大家参考,具体内容如下 1. Five.c // Five.c // SDL2 五子棋 // gcc -mwindows ...

  8. Delphi7 下基于SDL2+FFMPEG 实现USB摄像头播放及拍照

    目录 简述: 准备工作 获取视频设备类表 FFMPEG视频解码 视频播放 拍照 Demo下载 简述: delphi7 下进行USB摄像头开发网上的办法一般两种1.基于AVICAP32的windowsA ...

  9. java opengl_java基于OpenGL ES实现渲染实例

    这篇文章主要介绍了java基于OpenGL ES实现渲染,实例分析了OpenGL渲染操作的相关技巧,需要的朋友可以参考下 本文实例讲述了java基于OpenGL ES实现渲染的方法.分享给大家供大家参 ...

最新文章

  1. python string/list转换
  2. OLTP 数据库特点
  3. open source project for recommendation system
  4. php导出excel时间错误(同一个时间戳,用date得到不同的时间)
  5. c语言规定在一个源程序中main函数的位置是什么?
  6. 洛谷——P2299 Mzc和体委的争夺战
  7. MC新手入门(十三)------ 添加游戏角色
  8. python链接器编译器实现_一个链接器的实现「一」
  9. [导入]你的网站被订阅了吗(浅谈RSS2.0)续
  10. arduino 土壤温湿度传感器_三分钟告诉你Arduino是什么
  11. 计算机基础及应用期末,《计算机应用基础》期末复习综合练习题及答案
  12. 几行代码实现鼠标自动点击电脑屏幕指定位置,防止电脑或远程桌面休眠
  13. 前端使用Aliplayer 播放器 播放rtmp直播流
  14. 苹果CMS采集,苹果MacCMS采集插件
  15. 【Practical】并行化:VLIW
  16. 工控安全都有哪些风险
  17. 二维码怎么知道自己被扫描 ()==> java 篇 带一点点(Android)
  18. 3年风雨兼程-编程程软件测试终打破测试培训行业乱象
  19. linux777是什么权限,linux设置777权限意思
  20. android系统关机广播,Android开机广播和关机广播

热门文章

  1. [C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现
  2. win7下安装dynamips完全版
  3. Crystal Reports图表(上)
  4. php 简单模板引擎,PHP 实现简单的模板引擎
  5. 当下常用的webpack版本_细说 webpack系列 1. 为什么要选择 webpack
  6. 0xc0000225无法进系统_冷却塔进风格栅结冰主要原因及对策
  7. python并发与并行_python多进程,多线程分别是并行还是并发
  8. list删除某个元素_Python基础入门之列表(list)
  9. VBS遍历Excel工作表的方法
  10. Linux工业嵌入式应用