Android编译SDL2和demo展示(2.0.5)
来源:互联网 发布:tensorflow keyGRaph 编辑:程序博客网 时间:2024/06/07 02:00
什么是SDL(摘自百度百科):
SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。
由此可见SDL是跨平台的,而Android是基于Linux的,所以同理SDL也可以在Android编译成可用的动态库来使用。那么SDL在Android上面有什么作用呢,因为我本身是做应用开发的,所以自然想到的是媒体播放器了(哈哈),结合FFmpeg就可以播放音频和视频,不过这是后面要研究的了。
一:SDL下载
1)官方下载地址(https://www.libsdl.org/download-2.0.php),现在最新版本是(SDL2-2.0.5)
2)解压SDL2-2.0.5.zip,我们需要的是android-project、include、src和Android.mk
二:创建SDL项目
1)创建一个新的纯Android项目(包名就取android-project中一样的:org.libsdl.app)
2)在Android项目根目录下创建jni目录,然后在jni目录下面创建SDL目录,并把SDL2-2.0.5根目录下的include和src拷贝到SDL目录下:
3)把Android项目转换成C/C++项目:在Android项目上右键->Android tools->Add Native support
这里就默认名称就行。
转换后的项目中jni目录中生成了Android.mk和一个.cpp文件,我习惯把.cpp改成.c
4)现在是重要的地方了
1、在SDL的目录android-project中我们发现在jni中有src、Android.mk和Application.mk3个文件:
2、而在src目录里面还有Android.mk和Android_static.mk文件:
3、这就是官方为我们做的重要的事了,mk的编译脚本,src中的两个分为动态和静态(static)库编译脚本。这里我们把src中的Android.mk(动态库shared library)复制到SDL目录下:
4、接下来我们把SDL2-2.0.5根目录下的Android.mk文件中的shared library代码拷贝到SDL中Android.mk中,最后SDL中Android.mk文件内容如下:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := mainSDL_PATH := ../SDLLOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include# Add your application source files here...LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.c \YourSourceHere.cLOCAL_SHARED_LIBRARIES := SDL2LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -lloginclude $(BUILD_SHARED_LIBRARY)############################# SDL shared library############################include $(CLEAR_VARS)LOCAL_MODULE := SDL2LOCAL_C_INCLUDES := $(LOCAL_PATH)/includeLOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)LOCAL_SRC_FILES := \$(subst $(LOCAL_PATH)/,, \$(wildcard $(LOCAL_PATH)/src/*.c) \$(wildcard $(LOCAL_PATH)/src/audio/*.c) \$(wildcard $(LOCAL_PATH)/src/audio/android/*.c) \$(wildcard $(LOCAL_PATH)/src/audio/dummy/*.c) \$(LOCAL_PATH)/src/atomic/SDL_atomic.c \$(LOCAL_PATH)/src/atomic/SDL_spinlock.c.arm \$(wildcard $(LOCAL_PATH)/src/core/android/*.c) \$(wildcard $(LOCAL_PATH)/src/cpuinfo/*.c) \$(wildcard $(LOCAL_PATH)/src/dynapi/*.c) \$(wildcard $(LOCAL_PATH)/src/events/*.c) \$(wildcard $(LOCAL_PATH)/src/file/*.c) \$(wildcard $(LOCAL_PATH)/src/haptic/*.c) \$(wildcard $(LOCAL_PATH)/src/haptic/dummy/*.c) \$(wildcard $(LOCAL_PATH)/src/joystick/*.c) \$(wildcard $(LOCAL_PATH)/src/joystick/android/*.c) \$(wildcard $(LOCAL_PATH)/src/loadso/dlopen/*.c) \$(wildcard $(LOCAL_PATH)/src/power/*.c) \$(wildcard $(LOCAL_PATH)/src/power/android/*.c) \$(wildcard $(LOCAL_PATH)/src/filesystem/android/*.c) \$(wildcard $(LOCAL_PATH)/src/render/*.c) \$(wildcard $(LOCAL_PATH)/src/render/*/*.c) \$(wildcard $(LOCAL_PATH)/src/stdlib/*.c) \$(wildcard $(LOCAL_PATH)/src/thread/*.c) \$(wildcard $(LOCAL_PATH)/src/thread/pthread/*.c) \$(wildcard $(LOCAL_PATH)/src/timer/*.c) \$(wildcard $(LOCAL_PATH)/src/timer/unix/*.c) \$(wildcard $(LOCAL_PATH)/src/video/*.c) \$(wildcard $(LOCAL_PATH)/src/video/android/*.c) \$(wildcard $(LOCAL_PATH)/src/test/*.c))LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPESLOCAL_LDLIBS := -ldl -lGLESv1_CM -lGLESv2 -llog -landroidinclude $(BUILD_SHARED_LIBRARY)5)现在把项目中jni目录下的Android.mk的内容改成include $(call all-subdir-makefiles)其实就是SDL2-2.0.5\android-project\jni中Android.mk的内容,这一句的意思是调用子目录下所有的mk文件,这样SDL目录中的mk文件就能执行了。然后再把SDL2-2.0.5\android-project\jni中的Application.mk复制到项目jni目录下,最终如图所示:
6)接下来我们为SDL4Android.c文件添加如下代码:
#include <stdlib.h>#include <stdio.h>#include <time.h>#include "SDL.h"typedef struct Sprite{SDL_Texture* texture;Uint16 w;Uint16 h;} Sprite;/* Adapted from SDL's testspriteminimal.c */Sprite LoadSprite(const char* file, SDL_Renderer* renderer){Sprite result;result.texture = NULL;result.w = 0;result.h = 0; SDL_Surface* temp; /* Load the sprite image */ temp = SDL_LoadBMP(file); if (temp == NULL){ fprintf(stderr, "Couldn't load %s: %s\n", file, SDL_GetError()); return result; } result.w = temp->w; result.h = temp->h; /* Create texture from the image */ result.texture = SDL_CreateTextureFromSurface(renderer, temp); if (!result.texture) { fprintf(stderr, "Couldn't create texture: %s\n", SDL_GetError()); SDL_FreeSurface(temp); return result; } SDL_FreeSurface(temp); return result;}void draw(SDL_Window* window, SDL_Renderer* renderer, const Sprite sprite){int w, h;SDL_GetWindowSize(window, &w, &h);SDL_Rect destRect = {w/2 - sprite.w/2, h/2 - sprite.h/2, sprite.w, sprite.h};/* Blit the sprite onto the screen */SDL_RenderCopy(renderer, sprite.texture, NULL, &destRect);}int main(int argc, char *argv[]){ SDL_Window *window; SDL_Renderer *renderer; if(SDL_CreateWindowAndRenderer(0, 0, 0, &window, &renderer) < 0) exit(2);Sprite sprite = LoadSprite("zx.bmp", renderer); if(sprite.texture == NULL) exit(2); /* Main render loop */ Uint8 done = 0; SDL_Event event; while(!done){ /* Check for events */ while(SDL_PollEvent(&event)){ if(event.type == SDL_QUIT || event.type == SDL_KEYDOWN || event.type == SDL_FINGERDOWN){ //done = 1; } }/* Draw a gray background */SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);SDL_RenderClear(renderer);draw(window, renderer, sprite);/* Update the screen! */SDL_RenderPresent(renderer);SDL_Delay(10); } exit(0);}这段代码是根据(http://www.dinomage.com/wp-content/uploads/2013/01/main.c)改的,写好后把SDL4Android.c移动到SDL中src目录下,里面的zx.bmp图片(最终成功显示的图片)是添加到assets里面的:
把SDL中的Android.mk中的YourSourceHere.c改成$(SDL_PATH)/src/SDL4Android.c,最终改后的Android.mk文件内容为:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := mainSDL_PATH := ../SDLLOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include# Add your application source files here...LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.c \$(SDL_PATH)/src/SDL4Android.cLOCAL_SHARED_LIBRARIES := SDL2LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -lloginclude $(BUILD_SHARED_LIBRARY)############################# SDL shared library############################include $(CLEAR_VARS)LOCAL_MODULE := SDL2LOCAL_C_INCLUDES := $(LOCAL_PATH)/includeLOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)LOCAL_SRC_FILES := \$(subst $(LOCAL_PATH)/,, \$(wildcard $(LOCAL_PATH)/src/*.c) \$(wildcard $(LOCAL_PATH)/src/audio/*.c) \$(wildcard $(LOCAL_PATH)/src/audio/android/*.c) \$(wildcard $(LOCAL_PATH)/src/audio/dummy/*.c) \$(LOCAL_PATH)/src/atomic/SDL_atomic.c \$(LOCAL_PATH)/src/atomic/SDL_spinlock.c.arm \$(wildcard $(LOCAL_PATH)/src/core/android/*.c) \$(wildcard $(LOCAL_PATH)/src/cpuinfo/*.c) \$(wildcard $(LOCAL_PATH)/src/dynapi/*.c) \$(wildcard $(LOCAL_PATH)/src/events/*.c) \$(wildcard $(LOCAL_PATH)/src/file/*.c) \$(wildcard $(LOCAL_PATH)/src/haptic/*.c) \$(wildcard $(LOCAL_PATH)/src/haptic/dummy/*.c) \$(wildcard $(LOCAL_PATH)/src/joystick/*.c) \$(wildcard $(LOCAL_PATH)/src/joystick/android/*.c) \$(wildcard $(LOCAL_PATH)/src/loadso/dlopen/*.c) \$(wildcard $(LOCAL_PATH)/src/power/*.c) \$(wildcard $(LOCAL_PATH)/src/power/android/*.c) \$(wildcard $(LOCAL_PATH)/src/filesystem/android/*.c) \$(wildcard $(LOCAL_PATH)/src/render/*.c) \$(wildcard $(LOCAL_PATH)/src/render/*/*.c) \$(wildcard $(LOCAL_PATH)/src/stdlib/*.c) \$(wildcard $(LOCAL_PATH)/src/thread/*.c) \$(wildcard $(LOCAL_PATH)/src/thread/pthread/*.c) \$(wildcard $(LOCAL_PATH)/src/timer/*.c) \$(wildcard $(LOCAL_PATH)/src/timer/unix/*.c) \$(wildcard $(LOCAL_PATH)/src/video/*.c) \$(wildcard $(LOCAL_PATH)/src/video/android/*.c) \$(wildcard $(LOCAL_PATH)/src/test/*.c))LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPESLOCAL_LDLIBS := -ldl -lGLESv1_CM -lGLESv2 -llog -landroidinclude $(BUILD_SHARED_LIBRARY)7)到了这一步,我们的工作基本做完了,剩下的是把SDL2-2.0.5\android-project中的src中的SDLActivity.java和
res中的资源文件复制替换掉项目中的资源,删掉不需要的文件,并把SDLActivity改成启动Activity如图:
8)好了现在可以编译项目了:
最终生成了我们需要的.so库:
最后运行我们的项目:
至此就成功的在Android平台上面编译了SDL库,接下来就是和FFmpeg整合了,后面研究了再分享给大家。
源码下载地址:GitHub
睡觉了, 晚安各位!!!
- Android编译SDL2和demo展示(2.0.5)
- android r8 SDL2编译问题记录
- Android Studio用cmake编译SDL2
- sdl2 for android ubuntu开发环境搭建记录,编译SDL2 on ubuntu 16.04 x64
- Android SDL2.0 编译 --- ffplay android 移植过程
- Android SDL2.0 编译 --- ffplay android 移植过程
- mac平台编译sdl2.0.6和调试debug sdl
- SDL2 Qt Mingw编译
- AndroidStudio编译SDL2
- React 入门,5个常用DEMO展示
- React 入门,5个常用DEMO展示
- 编译TensorFlow Android Camera Demo
- android ndk r9 移植 live555 ffmpeg2.0 sdl2.0.1最新库整合编译
- jcef编译和demo运行
- jcef编译和demo运行
- 百度地图SDK for Android【Demo地图展示】
- android ui界面设计开发demo-智慧社区ui设计展示
- BCGSoft Demo示例展示:可视化和对话框示例
- memcached-java客户端xmemcached使用总结
- 001-项目简介
- 存储过程
- HTML使用Canvas实现弹幕功能
- 丁香园iOS电话面试问题总结
- Android编译SDL2和demo展示(2.0.5)
- struts配置各项默认值
- 如何批量下载Lynda.com 视频
- 软件测试面试必备的一些基础理论概念
- 基于Hibernate实践对ORM模式的一点思考
- 在eclipse中在线安装windowBuilder
- cocos2dx3.15接入微信SDK实现登录和分享android studio2.3.3
- struts中数据处理的几种方式
- 状态机引擎选型