Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SDL2库(1)-移植Android 端 CMakeList 集成

SDL2库(1)-移植Android 端 CMakeList 集成

作者头像
deep_sadness
发布于 2018-12-14 06:42:27
发布于 2018-12-14 06:42:27
2.7K00
代码可运行
举报
文章被收录于专栏:Flutter入门Flutter入门
运行总次数:0
代码可运行

SDL.png

项目位置 https://github.com/deepsadness/SDLCmakeDemo

简单的集成

1. 获取源代码

SDL的源代码获取十分简单。访问SDL的官方网站(http://www.libsdl.org/),单击左侧的“Download”进入下载页面,然后下载“SourceCode”栏目下的文件就可以了。 注意:这里使用的是 SDL2-2.0.9

解压完后的文件目录.png

我们在根目录里面有看到,SDL2的源码,已经为我们配置好了多种的编译环境。包括Cmake 和Android.mk文件。这样的话,我们直接使用它自带的编译环境就好了。

2. 创建自己的工程

复制文件
  • 复制源码文件到lib下面

将整个源码目录复制到lib下面.png

  • 复制Android部分的文件,到src 下

复制Android部分源码.png

  1. 把整个包复制过来。因为有JNI方法,所以包名暂时不能改。
  2. 注意Manifest内的内容也要对应复制过来
配置CmakeList.txt文件

通过add_subdirectory,直接使用SDL内配置好的Cmake。直接将整个库集成进来

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#直接添加SDLinclude_directories(${CMAKE_SOURCE_DIR}/libs/SDL2/include)
add_subdirectory(${CMAKE_SOURCE_DIR}/libs/SDL2)

Ps:这里它的CMakeList.txt文件中富含大量逻辑是学习好资料。。但是这里因为边幅原因,就不做分析了。

发生错误
错误1: 找不到 SDL_config.h

错误1:找不到 SDL_config.h.png

在上面,我们已经添加了include_directories,但是,还提示找不到头文件。 我们来到提示的SDL_config.h看到。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifdef USING_GENERATED_CONFIG_H
#error Wrong SDL_config.h, check your include path?
#endif
Solution

由于是定义来这个宏,导致错误,所以我们移除这个宏。 在SDL2源码目录下的CMakeLists.txt中,找到USING_GENERATED_CONFIG_H, 并且修改成如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 把原来的注释掉
# add_definitions(-DUSING_GENERATED_CONFIG_H)
# 添加移除掉这个宏
remove_definitions(-DUSING_GENERATED_CONFIG_H)
错误2: undefined reference to 'SDL_HIDAPI_JoystickDriver'
  1. 全局搜索 SDL_joystick.c中发现发现SDL_HIDAPI_JoystickDriver是因为定义宏SDL_JOYSTICK_HIDAPI才会被初始化的。 同时这个SDL_JOYSTICK_HIDAPI是直接在SDL_config_android.h中直接写死的。 编译Android的时候,一定会有。。。。

image.png

  1. 源码没有加入编译 我们通过观察目录发现这个时候。hidapi并没有加入编译

hidapi目录没有变色,说明没有加入编译.png

Solution

两种方案。

  • 方案1:直接去掉SDL_JOYSTICK_HIDAPI宏 通过了解,我们知道

Within the latest SDL2 development code, HIDAPI joystick drivers have been added to this library for providing more consistent support for the Xbox, PlayStation 4, and Nintendo Switch Pro controllers. HIDAPI is a multi-platform library for HID devices on Windows/Linux/macOS and now this unified code is used across platforms.

这个对我们基本上用不到。所以其实去掉也无所谓。

  1. 直接在SDL_config_android.h文件中把它注释掉
  2. 然后对应的,把对应Java代码的初始化注释掉。

对应的代码注释掉.png

这样就可以了。

  • 方案2:将hidapi也添加入编译中
  1. 找到对应的目录,添加CMakeList.txt

添加自己的CMakeList.png

我们看到这儿本来是有Android.mk文件的。

换的CMakeList如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cmake_minimum_required(VERSION 2.8.11)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Werror")
include_directories(${CMAKE_SOURCE_DIR}/../hidapi/hidapi/hidapi.h)
add_library(hidapi SHARED hid.cpp)

find_library(ANDROID_LOG_LIBRARY log)
target_link_libraries(hidapi ${ANDROID_LOG_LIBRARY})
  1. SDL2根目录下的CMakeList.txt进行修改

SDL2根目录下的CMakeList.png

找到SDL_SHARED库定义的地方

SDL_SHARED库编译定义的位置.png

修改成如下 如注释中所见,添加了 判断,如果是Android的话,就添加hidapi库,并将其连接到SDL2库中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (SDL_SHARED)
    #自己添加的hidapi
    if(ANDROID)
        ![屏幕快照 2018-11-14 上午1.14.37.png](https://upload-images.jianshu.io/upload_images/1877190-17f1fcabb9472722.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
# 将hidapi 加入源码目录。进行编译
        file(GLOB HIDAPI_SOURCE ${CMAKE_SOURCE_DIR}/libs/SDL2/src/joystick/hidapi/*.c)
        set(SOURCE_FILES "${SOURCE_FILES};${HIDAPI_SOURCE}")
        # 将前面定义,作为子模块,进行编译
        add_subdirectory(${SDL2_SOURCE_DIR}/src/hidapi/android)
    endif ()
    add_library(SDL2 SHARED ${SOURCE_FILES} ${VERSION_SOURCES})
    if (APPLE)
        set_target_properties(SDL2 PROPERTIES
                MACOSX_RPATH 1
                OUTPUT_NAME "SDL2-${LT_RELEASE}")
    elseif (UNIX AND NOT ANDROID)
        set_target_properties(SDL2 PROPERTIES
                VERSION ${LT_VERSION}
                SOVERSION ${LT_REVISION}
                OUTPUT_NAME "SDL2-${LT_RELEASE}")
    else ()
        set_target_properties(SDL2 PROPERTIES
                VERSION ${SDL_VERSION}
                SOVERSION ${LT_REVISION}
                OUTPUT_NAME "SDL2")
    endif ()
    if (MSVC AND NOT LIBC)
        # Don't try to link with the default set of libraries.
        set_target_properties(SDL2 PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
        set_target_properties(SDL2 PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
        set_target_properties(SDL2 PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
    endif ()
    set(_INSTALL_LIBS "SDL2" ${_INSTALL_LIBS})
  #自己添加的hidapi ,把它添加到里面编译
    if(ANDROID)
        target_link_libraries(SDL2 ${EXTRA_LIBS} ${EXTRA_LDFLAGS} hidapi)
    else ()
        target_link_libraries(SDL2 ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
    endif ()
    target_include_directories(SDL2 PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include/SDL2>)
    if (NOT ANDROID)
        set_target_properties(SDL2 PROPERTIES DEBUG_POSTFIX ${SDL_CMAKE_DEBUG_POSTFIX})
    endif ()
endif ()

同时注释掉,CMakeList.txt中我们不需要的静态库和INSTALL的部分。如图所示的,剩下的文件部分全部注释掉。

从SDL static文件开始,全部注释掉.png

注释掉的原因: 一方面我们不需要它。我们只需要SHARED库就可以了。 另一方面,留着在INSTALL时会报错,简单起见,注释掉就可以。

配置自己的源文件

我们可以看到有android_project项目。 我们切换到目录下,具体看一下

屏幕快照 2018-11-13 上午9.39.57.png

来看看这里的Android.mk文件是怎么写的 先看Application.mk

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
这里是能够编译各种版本
APP_ABI := armeabi-v7a arm64-v8a x86 x86_64

支持的Api 版本是14
# Min runtime API level
APP_PLATFORM=android-14

看一下src/Android.mk文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := main

SDL_PATH := ../SDL

LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include

# Add your application source files here...
LOCAL_SRC_FILES := YourSourceHere.c

LOCAL_SHARED_LIBRARIES := SDL2

LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -llog

include $(BUILD_SHARED_LIBRARY)

从这儿我们可以看到,

  1. 源码的include在外面的目录下面
  2. 需要添加的连接库包括 GLES_v1 和GLESv2
  3. 需要自己添加自己的源文件目录

好。直接修改成CMakeList.txt就可以了。 注意。这里改的是我们自己工程APP下的CMakeList.txt

APP下的CMakeList.png

添加如下内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
add_library(
        #他原来的名字,就是叫main  保持一致
        main
        SHARED
        src/main/cpp/native-lib.cpp)
find_library( 
        log-lib
        log)

target_link_libraries(
        main
        SDL2
        GLESv1_CM
        GLESv2
        ffmpeg
        ${log-lib})

简单明了。

3. 编写自己的native-lib.cpp

简单的显示一个图片地址.下载后,放到Asset文件夹中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//把显示图片的原来的main方法给注释掉了
extern "C"
//这里是直接定义了SDL的main方法吗
int main(int argc, char *argv[]) {

    // 打印ffmpeg信息
    const char *str = avcodec_configuration();
    ALOGI("avcodec_configuration: %s", str);

    char *video_path = argv[1];
    ALOGI("video_path  : %s", video_path);

    //开始准备sdl的部分
    //SDL 要素  window render texture  
    SDL_Window *window;
    SDL_Renderer *renderer;
    SDL_Event event;

    //初始化SDL
    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        ALOGE("Could not initialize SDL - %s", SDL_GetError());
        return 1;
    }

    //创建窗口  位置是中间。大小是0 ,SDL创建窗口的时候,大小都是0
    window = SDL_CreateWindow("SDL_Window", SDL_WINDOWPOS_CENTERED,
                              SDL_WINDOWPOS_CENTERED, 0, 0, SDL_WINDOW_SHOWN);
    //创建Renderer -1 表示使用默认的窗口 后面一个是Renderer的方式,0的话,应该就是未指定把???
    renderer = SDL_CreateRenderer(window, -1, 0);

    //因为只是简单展示一个图片,所以就创建一个Surface
    SDL_Surface *bmp = SDL_LoadBMP("image.bmp");

    //设置图中的透明色。
    SDL_SetColorKey(bmp, SDL_TRUE, 0xffffff);

    //创建一个texture
    SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, bmp);
    //清楚所有的事件?
    SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT);

    //进入主循环,就是不断的刷新。这个应该是根据屏幕刷新率去刷新吗?
    while (1) {
        if (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                break;
            }
        }

        //先填充窗口的颜色
        SDL_SetRenderDrawColor(renderer, 0, 133, 119, 255);
        SDL_RenderClear(renderer);

        //RenderCopy RenderPresent 后面两个矩阵,可以分配这个texture的大小
        SDL_RenderCopy(renderer, texture, NULL, NULL);
        //刷新屏幕
        SDL_RenderPresent(renderer);
    }

    SDL_FreeSurface(bmp);

    SDL_DestroyTexture(texture);

    SDL_DestroyRenderer(renderer);

    SDL_DestroyWindow(window);

    SDL_Quit();

    return 0;
}

这样就就可以运行成功了!!

运行结果

运行结果.png

缺陷
  1. 缺陷就是SDLActivity 这些都已经写死了。其实我们需要的只是一个SDLSurface就可以展示我们想要的。 没事。这个是后话。后面接着分析。

参考

FFmpeg编程开发笔记 —— Android 移植 FFmpeg + SDL2.0 库

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.11.14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​openssl Android编译指南
打开根目录下的build.info, 注释下面几行, 在Line:590~594, 否则会有类似错误提示 ${LDCMD:-g++} ld: unknown option: --sysroot=.
望天
2019/09/16
7.1K1
libyuv编译Android平台so
在之前的Android FFmpeg系列09--抽帧与快速抽帧文章里用到了libyuv来将FFmpeg解码的视频AVFrame统一转化为RGBA格式输出
雪月清
2022/11/19
1.9K0
libyuv编译Android平台so
cmake 学习笔记(一)
http://blog.csdn.net/dbzhang800/article/details/6314073
bear_fish
2018/09/20
5630
【Android NDK 开发】Android Studio 的 NDK 配置 ( 源码编译配置 | 构建脚本配置 | 打包配置 | CMake 配置 | ndkBuild 配置 )
② 主要作用 : 主要作用是配置本工程中的 C/C++ 源码如何编译成动态库的 ;
韩曙亮
2023/03/27
3.2K0
C/C++生态工具链——编译构建工具CMake/CMakeList初探
CMake的全称是Cross-platform Make。我第一次参与Linux C++开发时使用的工具是Make,而后开始切换到CMake,一开始以为CMake是和C语言有关,原来开头的C表示它可以跨平台。
Coder-ZZ
2023/02/23
3K0
C/C++生态工具链——编译构建工具CMake/CMakeList初探
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )
参考 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 修改 7zr 交叉编译脚本 Android.mk | 交叉编译 lib7zr.so 动态库 ) 博客中的 p7zip 源码 , D:\develop\7zip\p7zip_16.02\CPP\ANDROID\7zr\jni\Android.mk 中的 -I 引入头文件参数中 , 涉及的头文件目录 ;
韩曙亮
2023/03/29
2.9K0
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )
Android利用SurfaceView显示Camera图像爬坑记(五) -- 在现有项目中加入NDK配置
前面几章我们已经把SurfaceView加载Camera实现实时帧显示图像完成了,我也说过,我们加载实时图像是为了对接OpenCV进行图像处理所以才生成的Bitmap图像。
Vaccae
2019/07/25
9990
Android NDK编程(二)---CMakeList.txt详解
前一篇我们介绍了《Android NDK编程(一)---NDK介绍及环境搭建》,简单介绍了一下什么是NDK和JNI,以前NDK环境的配置及怎么创建第一个NDK的程序,在上一篇的左侧栏中有一个CMakeList.txt的文件,这一章我们就来解析一下CMakeList文件。
Vaccae
2019/07/25
3.5K0
Android JNI学习(二)——实战JNI之“hello world”
首先在Android Studio创建一个Android项目,包名为gebilaolitou.ndkdemo
隔壁老李头
2018/08/30
3.1K0
Android JNI学习(二)——实战JNI之“hello world”
【Android NDK 开发】Android Studio 使用 CMake 导入静态库 ( CMake 简介 | 构建脚本路径配置 | 引入静态库 | 指定静态库路径 | 链接动态库 )
① 构建工具 : CMake 是 Android 中使用 C/C++ 构建原生库的默认工具 ;
韩曙亮
2023/03/27
3.1K0
android SDL系列讲解(十三) 播放音乐库 SDL_mixer教程
SDL系列讲解(一) 简介 SDL系列讲解(二) 环境搭建 SDL系列讲解(三) 工具安装 SDL是什么,能干什么,为什么我们要学习它? SDL系列讲解(四) demo讲解 SDL系列讲解(五) 调试c代码 SDL系列讲解(六) SDL_Activity流程 SDL系列讲解(七) SDL_image教程 SDL系列讲解(八) SDL_ttf教程 SDL系列讲解(九) 异常退出分析 SDL系列讲解(十) 按键处理流程 SDL系列讲解(十一) SDL_QUIT流程 SDL系列讲解(十二)创建窗口流程
用户1263308
2018/02/02
2.4K0
android SDL系列讲解(十三) 播放音乐库 SDL_mixer教程
【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )
在之前的一系列博客中使用 lib7zr.so 动态库处理压缩文件 , 本篇博客中使用静态库处理压缩文件 , 仅做参考 ;
韩曙亮
2023/03/29
3.2K0
【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )
Android引入OpenCV
简介 在移动开发中,如果我们要实现一些图像处理相关的功能,难免要用到OpenCV。而OpenCV是用c++开发的。我们在Android中,需要使用jni的方法去使用它。 引入配置 我们引入jni开发的基本配置方法,已经在另一篇博客中介绍过了,不再赘述。这一次我们无非是要引入第三方的c++库。 首先,我们找到或新建jniLibs文件夹,然后将依赖的动态库和静态库(路径为OpenCV-android-sdk\sdk\native\libs)拷贝到\src\main\jniLibs下面。 然后,找到cpp文件夹。
Oceanlong
2018/07/03
1.3K0
SDL2库(3)-Android 端源码简要分析(VideoSubSystem)参考
项目位置 https://github.com/deepsadness/SDLCmakeDemo
deep_sadness
2018/12/14
3K0
SDL2库(3)-Android 端源码简要分析(VideoSubSystem)参考
Android NDK 开发之 CMake 必知必会
Android Studio 从 2.2 版本起开始支持 CMake ,可以通过 CMake 和 NDK 将 C/C++ 代码编译成底层的库,然后再配合 Gradle 的编译将库打包到 APK 中。
音视频开发进阶
2019/07/26
1.6K0
Android FFmpeg 编译和集成(十四)
因为FFmpeg是一套集录制、转换以及流化音视频的完整的跨平台解决方案,如果我们开发者想直接在自己开发的Android应用中使用ffmpeg的提供的功能,则需要引入so静态库,比如制作一些音视频编辑应用。
PengJie
2021/01/14
10.3K1
手把手教你如何在Android下进行JNI开发(入门)
(1)LOCAL_PATH:=$(callmy-dir) :指向当前目录的地址,包含该.mk
xuexiangjys
2022/04/18
5.4K0
手把手教你如何在Android下进行JNI开发(入门)
OpenCv as配置
copy到opencv的javalib里面当so运行就可,调用initDebug初始化即可
曾大稳
2018/09/11
1.1K0
OpenCv  as配置
SDL2库(2)-Android 端集成FFmpeg及简单的播放器
项目位置 https://github.com/deepsadness/SDLCmakeDemo
deep_sadness
2018/12/14
1.7K0
SDL2库(2)-Android 端集成FFmpeg及简单的播放器
Linux下ndk编译移植FFmpeg到Android平台简介
这里我们选择3.2.4版本(注意:这里使用的3.2.4版本,如果用最新的版本,编译可能出现问题,为了想让大家上手,建议版本先保持一致)。直接github上选择下载解压即可。为了方便编译,我们在解压后的目录中写一个shell脚本来进行配置。build_ffmpeg.sh
用户2929716
2018/08/23
2.1K0
Linux下ndk编译移植FFmpeg到Android平台简介
推荐阅读
​openssl Android编译指南
7.1K1
libyuv编译Android平台so
1.9K0
cmake 学习笔记(一)
5630
【Android NDK 开发】Android Studio 的 NDK 配置 ( 源码编译配置 | 构建脚本配置 | 打包配置 | CMake 配置 | ndkBuild 配置 )
3.2K0
C/C++生态工具链——编译构建工具CMake/CMakeList初探
3K0
【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )
2.9K0
Android利用SurfaceView显示Camera图像爬坑记(五) -- 在现有项目中加入NDK配置
9990
Android NDK编程(二)---CMakeList.txt详解
3.5K0
Android JNI学习(二)——实战JNI之“hello world”
3.1K0
【Android NDK 开发】Android Studio 使用 CMake 导入静态库 ( CMake 简介 | 构建脚本路径配置 | 引入静态库 | 指定静态库路径 | 链接动态库 )
3.1K0
android SDL系列讲解(十三) 播放音乐库 SDL_mixer教程
2.4K0
【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )
3.2K0
Android引入OpenCV
1.3K0
SDL2库(3)-Android 端源码简要分析(VideoSubSystem)参考
3K0
Android NDK 开发之 CMake 必知必会
1.6K0
Android FFmpeg 编译和集成(十四)
10.3K1
手把手教你如何在Android下进行JNI开发(入门)
5.4K0
OpenCv as配置
1.1K0
SDL2库(2)-Android 端集成FFmpeg及简单的播放器
1.7K0
Linux下ndk编译移植FFmpeg到Android平台简介
2.1K0
相关推荐
​openssl Android编译指南
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验