此篇文章需要引用Visual Studio 编译 Android 版本 SDL 步骤记录,写C/C++代码,我个人还是钟爱Visual Studio,即时是写Android程序。但是开发Android程序,将所有代码引入到Android Studio中,确实少了来回折腾的麻烦。
Andorid Studio - 3.4.1
SDL - 2.0.10
SDK - 28
cmake >= 3.4.1
PS:配置完成后,可以进行修改、调试SDL2源代码。
src/*.c
src/audio/*.c
src/audio/android/*.c
src/audio/dummy/*.c
src/audio/openslES/*.c
src/atomic/*.c
src/core/android/*.c
src/cpuinfo/*.c
src/dynapi/*.c
src/events/*.c
src/file/*.c
src/filesystem/android/*.c
src/haptic/*.c
src/haptic/android/*.c
src/joystick/*.c
src/joystick/android/*.c
src/joystick/hidapi/*.c
src/libm/*.c
src/loadso/dlopen/*.c
src/power/*.c
src/power/android/*.c
src/render/*.c
src/render/*/*.c
src/sensor/*.c
src/sensor/android/*.c
src/stdlib/*.c
src/test/*.c
src/thread/*.c
src/thread/pthread/*.c
src/timer/*.c
src/timer/unix/*.c
src/video/*.c
src/video/android/*.c
src/video/khronos/*.c
src/video/yuv2rgb/*.c
SDL依赖两个外部库,cpufeatures(设备CPU信息) 和 hidapi(HID设备API)。这里采用和《Visual Studio 编译 Android 版本 SDL 步骤记录》一样的策略,cpufeatures直接引入代码一起编译,hidapi使用已经编译好的so包,还是大伙自己编译哈 ~ 当然,我们也可以直接将cpufeatures和hidapi作为外部项目编写进cmake脚本,但是我个人觉得整个项目会弄得稍微有点乱,没有采用,大伙可以自己试试看。下面是我的代码目录结构:
SDL2 目录下是SDL2 Android相关源代码,include目录是头文件,大家看到这里多了一个SDL2main.cpp文件,稍后我们将实现Android 版本的welcome to SDL2 world !
cmake {
cppFlags "-std=c++11"
cFlags "-DGL_GLEXT_PROTOTYPES"
cFlags "-Wunneeded-internal-declaration"
cFlags "-Wmissing-variable-declarations"
cFlags "-Wall -Wextra"
cFlags "-Wdocumentation"
cFlags "-Wdocumentation-unknown-command"
cFlags "-Wmissing-prototypes"
cFlags "-Wunreachable-code-break"
cFlags "-Wunneeded-internal-declaration"
cFlags "-Wmissing-variable-declarations"
cFlags "-Wfloat-conversion"
cFlags "-Wshorten-64-to-32"
cFlags "-Wunreachable-code-return"
//# Warnings we haven't fixed (yet)
// cFlags "-Wno - unused - parameter - Wno - sign - compare"
}
cmake_minimum_required(VERSION 3.4.1)
include_directories(./include)
#递归遍历目录下的文件
file(GLOB_RECURSE SRC_LIST ./SDL2/*.c)
add_library( # Sets the name of the library.
SDL2
SHARED
../../../src/main/cpp/SDL2main.cpp
${SRC_LIST})
# -ldl -lGLESv1_CM -lGLESv2 -llog -landroid -lm -lOpenSLES -lhidapi
find_library( # Sets the name of the path variable.
dl-lib
dl)
find_library( # Sets the name of the path variable.
GLESv1_CM-lib
GLESv1_CM)
find_library( # Sets the name of the path variable.
GLESv2-lib
GLESv2)
find_library( # Sets the name of the path variable.
log-lib
log)
find_library( # Sets the name of the path variable.
android-lib
android)
find_library( # Sets the name of the path variable.
m-lib
m)
find_library( # Sets the name of the path variable.
OpenSLES-lib
OpenSLES)
add_library(
hidapi
SHARED
IMPORTED)
set_target_properties(
hidapi
PROPERTIES IMPORTED_LOCATION
../../../../libs/${ANDROID_ABI}/libhidapi.so)
# -ldl -lGLESv1_CM -lGLESv2 -llog -landroid -lm -lOpenSLES -lhidapi
target_link_libraries( # Specifies the target library.
SDL2
${dl-lib}
${GLESv1_CM-lib}
${GLESv2-lib}
${log-lib}
${android-lib}
${m-lib}
${OpenSLES-lib}
${log-lib}
hidapi)
注意:脚本中使用到的路径,大家根据实际项目进行修改。
至此,我们可以先暂时移除cmake脚本中的 src/main/cpp/SDL2main.cpp 文件,进行编译,你会在build目录下找到libSDL2.so文件:
PS:这里的步骤比较简略,以后希望可以另起一遍文章进行详解。希望大家能够下载此项目压缩包,查看代码理解。
将刚刚移除的 src/main/cpp/SDL2main.cpp 文件添加到cmake脚本中,里面已经有写好的SDL2 入口函数SDL_main。
#include
static const char *TAG = "SDL2main";
extern "C" {
#include "SDL.h"
int SDL_main(int argc, char *argv[]) {
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER)) {
__android_log_print(ANDROID_LOG_ERROR, TAG,
"Could not initialize SDL - %s\n", SDL_GetError());
return -1;
}
__android_log_print(ANDROID_LOG_INFO, TAG, "welcome to SDL2 world!");
return 0;
}
}
我们初始化SDL,并打印出是否初始成功。
当然,我们还要引入SDL2 官方已经实现好的Java示例代码android-project。
将SDLActivity添加到AndroidManifest.xml中,并修改SDLActivity中so库加载代码:
在MainActivity中添加跳转点击事件,编译运行APK,你应该可以在终端看到如下输出:
注释:Visual Studio 和 Android Studio 编译版本大小对比:
目前还不清楚为何会有如此大差距,猜想是Visual Studio对C/C++编译优化要比Android Studio做的好,希望大家可以给出更精确的答案,或者是我个人编译问题。
armeabi-v7a 平台so库
工程代码
https://gitee.com/canber/YCY-src/blob/master/sdl2compile-android-studio.rar