环境准备

  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 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下基于SDL的位图渲染(一)的更多相关文章

  1. Android下基于SDL的位图渲染(二)理论篇

    理论篇 上一篇中介绍了如何将SDL2源码应用到Android渲染中,实际上SDL本身提供的android-project实现了基于android的c运行时环境,通过上面实践篇的介绍,就是完成这个环境搭 ...

  2. Android下基于SDL的YUV渲染

    实战篇 本文主要参考我之前整理的文章windows下使用SDL进行YUV渲染. 相对于之前写的位图渲染部分(http://www.cnblogs.com/tocy/p/android-sdl-bitm ...

  3. Android下基于PCM的音频渲染

    环境准备 请按照我之前的文章-Android下基于SDL的位图渲染,安装必要的开发环境. 实践篇 这里主要参考Beginning SDL 2.0(6) 音频渲染及wav播放,只不过将源从WAV文件改成 ...

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

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

  5. Android 颜色渲染(四) BitmapShader位图渲染

    版权声明:本文为博主原创文章,未经博主允许不得转载. Android 颜色处理(四) BitmapShader位图渲染 public   BitmapShader(Bitmap bitmap,Shad ...

  6. Dalvik模式下基于Android运行时类加载的函数dexFindClass脱壳

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78003184 前段时间在看雪论坛发现了<发现一个安卓万能脱壳方法>这篇 ...

  7. Android下OpenCV的环境搭建

    目录(?)[-] 前言 系统环境 相关工具 Android ADT环境搭建 Android SDK环境变量的配置 Android NDK的安装与配置 OpenCV for Android 环境搭建 基 ...

  8. android下的数据存储

    android下数据存储的几种方式:(简单讨论) 1.文件 举例:登陆时“记住密码” 因为是基于Linux系统,直接建文件,文件会出现在项目工程:而手机登陆时,应该把文件放在手机里,通常数据放在dat ...

  9. Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/7932268 在前面一篇文章中,我们分析了And ...

随机推荐

  1. servlet乱码 解决方法 2种方法

    public class ResponseDemo1 extends HttpServlet { public void doGet(HttpServletRequest req, HttpServl ...

  2. lucene之中文分词及其高亮显示

    参考:http://www.cnblogs.com/lirenzhujiu/p/5914174.html http://www.cnblogs.com/xing901022/p/3933675.htm ...

  3. zabbix数据库需要多大硬盘?我告诉你

    本次案例:100台服务器,每台服务器有30个监控项,每个监控项60秒刷新一次,需要多大的硬盘呢?众所周知,zabbix基本都是通过web配置,这些配置数据也是存放到数据库里的,但是它对硬盘容量的要求基 ...

  4. Linux 下C编程(一)文件基础

    博主原创,转载请加上http://www.cnblogs.com/jikexianfeng/p/5769357.html 一.课程概要 1.文件描述符 2.文件操作和内核数据结构 3.文件原子操作 二 ...

  5. sudo: add-apt-repository: command not found

    错误来啦:sudo: add-apt-repository:command not found      网上解决办法是直接安装工具包 命令:sudo apt-get install python-s ...

  6. 【Linux】数据流重导向(后篇)

    1)/dev/null 垃圾桶黑洞装置与特殊写法 想象一下,如果我知道错误信息会发生,所以要将错误信息忽略掉而不显示或储存呢? 这个时候黑洞装置 /dev/null 就很重要了!这个 /dev/nul ...

  7. EasyUI datagird 排序 按数字类型的问题

    easyui datagird 默认显示的数据都是字符, 对要数字列进行排序规则,需要自定义排序规则如果按字符排序 27竟然小于4 这不是我们想要的.解决方案 <table id='grid'c ...

  8. Java之基于S2SH与手机数据交互(一)

    在前两篇博客,介绍了在eclipse上搭建SSH,可是好多小伙伴反映.看了偶写滴博客.跟着搭建还是错误百出,唉! 事实上不经历错误怎么能不见红线啊!于是我在上篇博客补充了他们的错误,还在被错误困扰的童 ...

  9. ArcGIS 10.2数字化线状要素时自己主动拼接成一条线

    一開始一直和捕捉和经典捕捉过不去.最后才发现找错了地方,原来要Customize.自己定义加入"Continue Feature"工具,将其拖动到界面上的随意工具条内就可以.如图1 ...

  10. 【转载】java前后端 动静分离,JavaWeb项目为什么我们要放弃jsp?

    原文:http://blog.csdn.net/piantoutongyang/article/details/50878214 今天看到两篇文章,讲解 为什么web开发启用jsp,确实挺有道理,整理 ...