本篇日期:2017-3-5
基本环境:
1. 操作系统:Windows10 64位;
2. Android Studio 2.3,64位。
3. Android NDK开发包:直接使用Android Studio安装NDK。(需要梯子)
操作步骤:
第一步:准备SDL源代码包;
1. 去http://www.libsdl.org/官网下载最新版SDL2-2.0.5
2. 解压后,可以在根目录下找到android-project目录。
3. 调整目录,使其成为一个可编译的工程:
(1) 将android-project目录剪切到与SDL2-2.0.5同级的目录;
(2) 然后将SDL2-2.0.5目录拷贝到android-project\jni目录下,并重命名为SDL;
第二步:为SDL增加main函数
1、main.c文件,可以从http://www.dinomage.com/wp-content/uploads/2013/01/main.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("image.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);
}
2、下载之后将其放入android-project\jni\src目录;
3、将main.c加入android-project\jni\src\Android.mk: 在Android.mk中默认有个YourSourceHere.c,将其替换为main.c即可;
第三步:编译libSDL2.so和libmain.so
注意:请确认NDK的bin目录(安装默认安装是:C:\Users\user\AppData\Local\Android\sdk\ndk-bundle)已经配置到环境变量PATH中去;
打开cmd命令窗口,进入到android-project目录,然后执行"ndk-build"命令进行编译。
【坑】执行ndk-build将会出现一堆报错信息,能后死翘翘。应当执行ndk-build -i进行编译。
编译成功后会在android-project根目录下生成libs目录,下面有各个平台(注:只会生成armeabi-v7a 和x86 2个平台的)的需要的这两个so文件。
第四步:导入Android Studio运行
如果是在工程打开状态,选择File->Close Project。之后,选择”Import project(Eclipse ADT,Gradle,etc)”,然后选择android-project目录将工程文件导入到Andriod Studio中。
【坑】这样之后,按编译将出现若干错误,能后死翘翘。错误英文提示大意是这个工程里面有C/C++代码,应当使用cmake或者ndk编译。解决办法是,在andriod studio面板的Gradle Script -> build.gradle(Module:app),在buildTypes{……}的后面,加上这段:
sourceSets.main {
jniLibs.srcDir 'libs'
jni.srcDirs = []
}
然后选择按照正常的Android工程运行即可。这个时候程序闪一下什么都没有,因为没有添加资源。
下载一个bmp图片,提供一个官方文档中提到的bmp地址:http://www.dinomage.com/wp-content/uploads/2013/01/image.bmp。
到Andriod Studio面板,选择app,按右键,New->Folder->Assets Folder,再将下载的image.bmp放到这个目录下,重新编译运行这个apk,这个就是SDL 2.05的hello world了。
本篇主要参考了如下搏文:
如何成功运行SDL官方提供的Android平台的Demo :
http://blog.csdn.net/gobitan/article/details/24771311