第一个Android下的SDL2.0应用程序

时间:2023-01-24 12:10:01

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文件。

此时不要急着模拟程序,否则如下图一样,启动几秒后,自动退出了,也不提示什么错误。

第一个Android下的SDL2.0应用程序

如果想自己实现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
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
并把862-892行音频初始化部分也注释掉,

#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,执行。如下图:

第一个Android下的SDL2.0应用程序