Android SDK、NDK、ant的安装网上搜有一堆的,AVD创建、启动模拟器、adb等基本命令见我的blog《Android开发相关》
SDL2.0下载
http://www.libsdl.org/hg.php下载SDL-2.0.tar.gz
解压SDL-2.0.tar.gz
将其中的android-project剪切出来,可重命名,也可不重命名,将解压出来的SDL文件夹剪切到android-project/jni,并重命名为SDL
将jni/SDL/include下的SDL_config_android.h重命名为SDL_config.h(重命名前备份原SDL_config.h)
将SDL/test下的icon.bmp 、SDL/test/testsprite2.c、SDL/src/test/SDL_test_common.c复制到jni/src目录,
并将testsprite2.c 293行
if (LoadSprite("icon.bmp") < 0) {修改为
if (LoadSprite("/sdcard/data/icon.bmp") < 0) {将jni/src/Android.mk中的LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.cpp 一行下的YourSourceHere.c删除
添加testsprite2.c SDL_test_common.c
在android-project下执行命令
android update project --path . --target android-14,根据自己的SDK版本修改
在jni目录下执行ndk-build,编译即可成功.
在android-project下执行ant debug后即可在bin目录下生成apk文件。
此时不要急着模拟程序,否则如下图一样,启动几秒后,自动退出了,也不提示什么错误。如果想自己实现JNI接口函数,在bin目录下执行命令
javah -classpath classes -d ../jni/src org.libsdl.app.SDLActivity
会在jni/src/x下生成org_libsdl_app_SDLActivity.h和org_libsdl_app_SDLActivity_ShowTextInputHandler.h两个头文件,里面就是需要实现的JNI接口函数的声明。
下面分析出现上面看到的画面.
主要是在jni/SDL/src/main/android/SDL_android_main.cpp函数中实现了JNI接口函数,
Java_org_libsdl_app_SDLActivity_nativeInit
此函数中调用了SDL_Android_Init对SDL进行初始化过,所以在SDL_test_common.c文件中的函数
SDL_bool
SDLTest_CommonInit(SDLTest_CommonState * state)
中调用SDL_VideoInit时会失败,注释掉632-640行
#if 0并把862-892行音频初始化部分也注释掉,
if (SDL_VideoInit(state->videodriver) < 0) {
fprintf(stderr, "Couldn't initialize video driver: %s\n",
SDL_GetError());
return SDL_FALSE;
}
if (state->verbose & VERBOSE_VIDEO) {
fprintf(stderr, "Video driver: %s\n",
SDL_GetCurrentVideoDriver());
}
#endif
#if 0
if (state->flags & SDL_INIT_AUDIO) {
if (state->verbose & VERBOSE_AUDIO) {
n = SDL_GetNumAudioDrivers();
if (n == 0) {
fprintf(stderr, "No built-in audio drivers\n");
} else {
fprintf(stderr, "Built-in audio drivers:");
for (i = 0; i < n; ++i) {
if (i > 0) {
fprintf(stderr, ",");
}
fprintf(stderr, " %s", SDL_GetAudioDriver(i));
}
fprintf(stderr, "\n");
}
}
if (SDL_AudioInit(state->audiodriver) < 0) {
fprintf(stderr, "Couldn't initialize audio driver: %s\n",
SDL_GetError());
return SDL_FALSE;
}
if (state->verbose & VERBOSE_VIDEO) {
fprintf(stderr, "Audio driver: %s\n",
SDL_GetCurrentAudioDriver());
}
if (SDL_OpenAudio(&state->audiospec, NULL) < 0) {
fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError());
return SDL_FALSE;
}
}
#endif
把jni/SDL/include/SDL_test_common.h中41-42行
DEFAULT_WINDOW_WIDTH
DEFAULT_WINDOW_HEIGHT
修改为适合自己AVD的分辨率大小
jni目录下执行ndk-build重新进行编译.完成后,再使用ant打包.
启动模拟器(创建模拟器时请注意,因为icon.bmp是存放在/sdcard/data目录下,所以,需要创建一个带SD卡的AVD,具体怎么创建,参见我的blog《Android开发相关》)
android-project下执行命令adb push jni/src/icon.bmp /sdcard/data将icon.bmp推送到/sdcard/data目录下
android-project/bin下执行命令adb install SDLActivity-debug.apk安装应用,在模拟器菜单中找到SDL_app,执行。如下图: