如何使用 CMake 将 FreeType 导入我的 Android Studio NDK 项目

Posted

技术标签:

【中文标题】如何使用 CMake 将 FreeType 导入我的 Android Studio NDK 项目【英文标题】:How to import FreeType to my Android Studio NDK project using CMake 【发布时间】:2021-08-09 20:38:09 【问题描述】:

您好,我是 android NDK 编程的初学者,我需要一些帮助才能让 freetype 库与我的项目一起工作。我已经尝试了 3 个小时,以某种方式将 freetype 导入我的 Android Studio 项目。我在互联网上搜索,找不到任何有效的解决方案。我下载了该库并将其放在项目的 cpp 文件夹中。但我不知道如何包含 freetype。任何帮助将不胜感激!

这就是我的 CMakeLists.txt 外观和我添加的文件的样子:

cmake_minimum_required(VERSION 3.10.2)



project("firstnative")


include_directories(stb/stb_lib
        GoldFlow/Core
        GoldFlow/Graphics
        GoldFlow/Math
        GoldFlow/glm
        GoldFlow/glm/gtc
        GoldFlow/entt
        GoldFlow/physics
        GoldFlow/scripts

    GoldFlow/freetype/include
    GoldFlow/freetype/include/freetype/
    GoldFlow/freetype/include/freetype/config
    GoldFlow/freetype/include/freetype/internal
    GoldFlow/freetype/include/freetype/internal/services
        )



add_library( 
             Native
           
             SHARED


        GoldFlow/Math/GoldMath.cpp
        GoldFlow/Graphics/Shader.cpp
        GoldFlow/Graphics/Renderer2D.cpp
        GoldFlow/Graphics/Camera.cpp
        GoldFlow/Graphics/Texture.cpp
        GoldFlow/Graphics/SpriteSheet.cpp
        GoldFlow/Core/Scene.cpp
        GoldFlow/Core/GameObject.cpp
        GoldFlow/Core/Application.cpp
        GoldFlow/Core/Controls.cpp
        GoldFlow/Core/Timer.cpp
        GoldFlow/physics/AABB.cpp
        GoldFlow/physics/Objects.cpp
        GoldFlow/scripts/ControllerScript.cpp
        GoldFlow/scripts/CharacterMovingScript.cpp
        


        native.cpp)


add_library(
    Freetype

    SHARED

    GoldFlow/freetype/src/autofit/autofit.c
    GoldFlow/freetype/src/base/ftbase.c
    GoldFlow/freetype/src/base/ftbbox.c
    GoldFlow/freetype/src/base/ftbdf.c
    GoldFlow/freetype/src/base/ftbitmap.c
    GoldFlow/freetype/src/base/ftcid.c
    GoldFlow/freetype/src/base/ftfstype.c
    GoldFlow/freetype/src/base/ftgasp.c
    GoldFlow/freetype/src/base/ftglyph.c
    GoldFlow/freetype/src/base/ftgxval.c
    GoldFlow/freetype/src/base/ftinit.c
    GoldFlow/freetype/src/base/ftmm.c
    GoldFlow/freetype/src/base/ftotval.c
    GoldFlow/freetype/src/base/ftpatent.c
    GoldFlow/freetype/src/base/ftpfr.c
    GoldFlow/freetype/src/base/ftstroke.c
    GoldFlow/freetype/src/base/ftsynth.c
    GoldFlow/freetype/src/base/fttype1.c
    GoldFlow/freetype/src/base/ftwinfnt.c
    GoldFlow/freetype/src/bdf/bdf.c
    GoldFlow/freetype/src/bzip2/ftbzip2.c
    GoldFlow/freetype/src/cache/ftcache.c
    GoldFlow/freetype/src/cff/cff.c
    GoldFlow/freetype/src/cid/type1cid.c
    GoldFlow/freetype/src/gzip/ftgzip.c
    GoldFlow/freetype/src/lzw/ftlzw.c
    GoldFlow/freetype/src/pcf/pcf.c
    GoldFlow/freetype/src/pfr/pfr.c
    GoldFlow/freetype/src/psaux/psaux.c
    GoldFlow/freetype/src/pshinter/pshinter.c
    GoldFlow/freetype/src/psnames/psnames.c
    GoldFlow/freetype/src/raster/raster.c
    GoldFlow/freetype/src/sfnt/sfnt.c
    GoldFlow/freetype/src/smooth/smooth.c
    GoldFlow/freetype/src/truetype/truetype.c
    GoldFlow/freetype/src/type1/type1.c
    GoldFlow/freetype/src/type42/type42.c
    GoldFlow/freetype/src/winfonts/winfnt.c

)

find_library( 
              log-lib
              
              log )

find_library(GLES-lib

             GLESv3)



target_link_libraries( 
                       Native
             
                       $log-lib
                       $GLES-lib
                       $Freetype

        )

我现在得到的错误是:C:\Users\infer\AndroidStudioProjects\FirstNative\app\src\main\cpp\GoldFlow\freetype\src\base\ftbdf.c:40:14:错误:使用未声明的标识符“FT_ERR_PREFIXInvalid_Face_Handle”;你的意思是“FT_Err_Invalid_Face_Handle”吗?

【问题讨论】:

欢迎您从github.com/tanersener/mobile-ffmpeg 拉取freetype for Android(包括构建脚本)。这在 Windows 上不起作用,但你可以在你的 Windows 上安装 Ubuntu(又名 WSL)。 @AlexCohn 谢谢亚历克斯的回复。有没有其他不用安装ubuntu的方法? WSL 的安装很简单,它比使用 cygwin hack 的旧方法干净得多。您可以在任何 Linux 机器或 Mac 上构建您的 freetype。请注意,您必须只执行一次:您的项目将使用生成的二进制文件和生成的标头。 您可以尝试通过其官方CMakeLists.txt 在Windows 上构建freetype,我再次建议您将其作为Android 项目中的一个单独模块进行。如果你精通 CMake,你可以设置 subdirectory 为 freetype。 谢谢,我现在就去做。 【参考方案1】:

好的,解决方案非常简单。我实际上所做的只是在名为 freetype 的 cpp 文件夹中创建了目录,并在该目录中放置了每个 freetype 文件,然后将该文件夹添加为 CMake 中的子目录并在最后链接,现在一切正常。这是我的 CMake:

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.10.2)

# Declares and names the project.
project("firstnative")

include_directories(stb/stb_lib
        GoldFlow/Core
        GoldFlow/Graphics
        GoldFlow/Math
        GoldFlow/glm
        GoldFlow/glm/gtc
        GoldFlow/entt
        GoldFlow/physics
        GoldFlow/scripts
        GoldFlow/text
        )

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.
        Native
        # Sets the library as a shared library.
        SHARED
        # Provides a relative path to your source file(s).
        GoldFlow/Math/GoldMath.cpp
        GoldFlow/Graphics/Shader.cpp
        GoldFlow/Graphics/Renderer2D.cpp
        GoldFlow/Graphics/Camera.cpp
        GoldFlow/Graphics/Texture.cpp
        GoldFlow/Graphics/SpriteSheet.cpp
        GoldFlow/Core/Scene.cpp
        GoldFlow/Core/GameObject.cpp
        GoldFlow/Core/Application.cpp
        GoldFlow/Core/Controls.cpp
        GoldFlow/Core/Timer.cpp
        GoldFlow/physics/AABB.cpp
        GoldFlow/physics/Objects.cpp
        GoldFlow/scripts/ControllerScript.cpp
        GoldFlow/scripts/CharacterMovingScript.cpp
        GoldFlow/text/TextRenderer.cpp
        native.cpp)

# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.
#sd

find_library( # Sets the name of the path variable.
        log-lib
        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log )

find_library(GLES-lib
        GLESv3)

add_subdirectory(freetype)

target_link_libraries( # Specifies the target library.
        Native
        # Links the target library to the log and gl es library
        # included in the NDK.
        $log-lib
        $GLES-lib
        freetype
        )

【讨论】:

以上是关于如何使用 CMake 将 FreeType 导入我的 Android Studio NDK 项目的主要内容,如果未能解决你的问题,请参考以下文章

[CMakeLists][原创]引入freetype正确的写法

如何将 Glyphs 沿基线与 Freetype 对齐?

如何使用 CMake 构建和使用外部库

将导入的库链接到 CMake ExternalProject

qt将数据库sql添加到从cmake导入的项目中

仅将导入模块的标头添加到 CMake 中的库中