Andorid Studio 3.4 cmake 编译 SDL2

此篇文章需要引用Visual Studio 编译 Android 版本 SDL 步骤记录,写C/C++代码,我个人还是钟爱Visual Studio,即时是写Android程序。但是开发Android程序,将所有代码引入到Android Studio中,确实少了来回折腾的麻烦。

文章目录

    • 版本说明
    • 编译SDL2
      • 新建Android C++项目
      • 引入SDL2源代码
      • 脚本编写
      • 编写程序验证so包
    • 项目上传地址(码云)

版本说明

Andorid Studio - 3.4.1
SDL - 2.0.10
SDK - 28
cmake >= 3.4.1

PS:配置完成后,可以进行修改、调试SDL2源代码。

编译SDL2

新建Android C++项目

Andorid Studio 3.4 cmake 编译 SDL2_第1张图片

引入SDL2源代码

  • 下载SDL2源代码,参考《Visual Studio 编译 Android 版本 SDL 步骤记录》,将Android相关源代码引入到Android Studio中,或者直接下载项目(码云)压缩包,将已经提取好Android代码引入Android Studio中。这里还是给出代码列表:

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脚本,但是我个人觉得整个项目会弄得稍微有点乱,没有采用,大伙可以自己试试看。下面是我的代码目录结构:

Andorid Studio 3.4 cmake 编译 SDL2_第2张图片

SDL2 目录下是SDL2 Android相关源代码,include目录是头文件,大家看到这里多了一个SDL2main.cpp文件,稍后我们将实现Android 版本的welcome to SDL2 world !

脚本编写

  • build.gradle 配置,这里只给出编译器选项配置
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脚本
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文件:

Andorid Studio 3.4 cmake 编译 SDL2_第3张图片

编写程序验证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。

Andorid Studio 3.4 cmake 编译 SDL2_第4张图片

将SDLActivity添加到AndroidManifest.xml中,并修改SDLActivity中so库加载代码:

Andorid Studio 3.4 cmake 编译 SDL2_第5张图片
在MainActivity中添加跳转点击事件,编译运行APK,你应该可以在终端看到如下输出:

Andorid Studio 3.4 cmake 编译 SDL2_第6张图片

注释:Visual Studio 和 Android Studio 编译版本大小对比:

Andorid Studio 3.4 cmake 编译 SDL2_第7张图片

目前还不清楚为何会有如此大差距,猜想是Visual Studio对C/C++编译优化要比Android Studio做的好,希望大家可以给出更精确的答案,或者是我个人编译问题。

项目上传地址(码云)

  • armeabi-v7a 平台so库

  • 工程代码

https://gitee.com/canber/YCY-src/blob/master/sdl2compile-android-studio.rar

你可能感兴趣的:(Android音视频,SDL,Android,Studio,cmake)