zoukankan      html  css  js  c++  java
  • Android下基于SDL的位图渲染(一)

    环境准备

    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即可。

  • 相关阅读:
    TCP中的三次握手与四次挥手
    C++中的访问控制与封装
    C++中的类定义
    Verilog学习笔记设计和验证篇(三)...............同步有限状态机的指导原则
    Verilog学习笔记简单功能实现(三)...............同步有限状态机
    Verilog学习笔记设计和验证篇(二)...............同步有限状态机
    Verilog学习笔记设计和验证篇(一)...............总线和流水线
    Verilog学习笔记简单功能实现(二)...............全加器
    Verilog HDL模型的不同抽象级别
    Verilog学习笔记简单功能实现(一)...............D触发器
  • 原文地址:https://www.cnblogs.com/tocy/p/android-sdl-bitmap-render-coding.html
Copyright © 2011-2022 走看看