如何将 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_ABI
:arm64-v8a
,armeabi-v7a
,x86
,x86-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)
【讨论】:
我需要复制哪些文件才能包含?我从源(从 github 下载)和任何(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