如何将 libjpeg-turbo Android NDK 添加为静态库

Posted

技术标签:

【中文标题】如何将 libjpeg-turbo Android NDK 添加为静态库【英文标题】:How to add libjpeg-turbo Android NDK as static library 【发布时间】:2020-06-16 20:07:26 【问题描述】:

我想在我的 android NDK 项目中使用 libjpeg-turbo(完全只有 libjpeg)。我找不到如何将库完全添加到我的项目中。

首先,我使用BUILDING.md构建它(作为四个ANDROID_ABIarm64-v8aarmeabi-v7ax86x86-64)。 其次,我准备在我的项目src/main/cpp文件夹libjpeg并放入ANDROID_ABI文件夹libjpeg.a静态库。

接下来我添加到CMakeLists.txt:

add_library( libjpeg STATIC IMPORTED )
set_target_properties( libjpeg
        PROPERTIES
        IMPORTED_LOCATION $CMAKE_SOURCE_DIR/libjpeg/$ANDROID_ABI/libjpeg.a )
# and
target_link_libraries(
    native-lib
    libjpeg
    $log-lib)

下面是我的整个 CMakeLists.txt:

cmake_minimum_required(VERSION 3.4.1)

add_library( libjpeg STATIC IMPORTED )
set_target_properties( libjpeg
        PROPERTIES
        IMPORTED_LOCATION $CMAKE_SOURCE_DIR/libjpeg/$ANDROID_ABI/libjpeg.a )


include_directories(src/main/cpp/rapidjson/)
include_directories(src/main/cpp/Eigen)

file(GLOB CPP_FILES "src/main/cpp/*.cpp")
add_library(
        native-lib
        SHARED

        native-lib.cpp
        common.cpp
        archive.cpp
        crc32.cpp
        image.cpp
        read_manifest.cpp
        sensors.cpp
        thumbnail.cpp
        upf.cpp
        upf-toolkit.cpp
        write_manifest.cpp
        write_upf.cpp
        )
find_library(log-lib log)
target_link_libraries(native-lib libjpeg $log-lib)

我没有构建错误,但我无法在我的 cpp 文件中包含 libjpeg 标头。

【问题讨论】:

我无法在我的 cpp 文件中导入库”是什么意思...?这是什么意思?你怎么知道不能导入?发生什么,或不发生什么?你能在你的问题帖子中举个例子吗? 当我将#include <libjpeg.h> 添加到我的代码中时出现编译错误。 谢谢,您能否将完整的错误消息添加到您的问题帖子中? 【参考方案1】:

您收到编译错误是因为您的 CMake 代码未指定 libjpeg 头文件的位置。您可以通过为导入的libjpeg 目标设置INTERFACE_INCLUDE_DIRECTORIES 属性来指定包含libjpeg 标头的目录。

add_library( libjpeg STATIC IMPORTED )
set_target_properties( libjpeg
        PROPERTIES
        IMPORTED_LOCATION $CMAKE_SOURCE_DIR/libjpeg/$ANDROID_ABI/libjpeg.a
        INTERFACE_INCLUDE_DIRECTORIES $CMAKE_SOURCE_DIR/libjpeg/include
)

注意:您可能需要修改路径以匹配这些标头在您的计算机上的位置。

加上其他一些挑剔的注释(与错误无关),您更新后的 CMake 文件可能如下所示:

cmake_minimum_required(VERSION 3.4.1)

# You should always put the project directive at the top of your root CMakeLists.txt file.
project(MyProject)

add_library( libjpeg STATIC IMPORTED )
set_target_properties( libjpeg
        PROPERTIES
        IMPORTED_LOCATION $CMAKE_SOURCE_DIR/libjpeg/$ANDROID_ABI/libjpeg.a
        INTERFACE_INCLUDE_DIRECTORIES $CMAKE_SOURCE_DIR/libjpeg/include
)

# You can list multiple directories in one include_directories() call.
include_directories(
    src/main/cpp/rapidjson/
    src/main/cpp/Eigen
)

# Looks like this isn't used. Maybe you can remove it.
file(GLOB CPP_FILES "src/main/cpp/*.cpp")

add_library(
        native-lib
        SHARED

        native-lib.cpp
        common.cpp
        archive.cpp
        crc32.cpp
        image.cpp
        read_manifest.cpp
        sensors.cpp
        thumbnail.cpp
        upf.cpp
        upf-toolkit.cpp
        write_manifest.cpp
        write_upf.cpp
        )
find_library(log-lib log)

# Always place the scoping argument (e.g. PUBLIC, PRIVATE) in this call.
target_link_libraries(native-lib PUBLIC libjpeg $log-lib)

【讨论】:

我需要复制哪些文件才能包含?我从源(从 gi​​thub 下载)和任何(ANDROID_ABI 之一)构建目录中的所有标头复制了所有标头 - 是否正确? @M.Liver 您的问题帖子没有指定您使用的存储库,所以我不确定。最好将 INTERFACE_INCLUDE_DIRECTORIES 的 CMake 路径更改为指向 包含 包含文件的目录,而不是复制单个文件。 感谢您的回答。 ?

以上是关于如何将 libjpeg-turbo Android NDK 添加为静态库的主要内容,如果未能解决你的问题,请参考以下文章

Android-JNI开发系列《十》实践利用libjpeg-turbo完美压缩图片不失真

libjpeg-turbo的压缩速度和我程序中的libjpeg没有区别

如何让 libjpeg-turbo 的 java 包装器实际压缩?

windows 10上源码编译libjpeg-turbo和使用教程 | compile and use libjpeg-turbo on windows 10

Go初接触之libjpeg-turbo

markdown 的libjpeg-turbo.repo