安卓cmake 不同的阿比

Android cmake different abi

本文关键字:cmake 安卓      更新时间:2023-10-16

我使用预构建的安卓原生库:libcrypto.a .库是为armeabi, armeabi-v7a and x86编译的。结构:

-app
  - CMakeLists.txt
  - libs
    - armeabi
    - armeabi-v7a
    - x86

每个文件夹 ( armeabi, armeabi-v7a and x86 ( 包含文件夹lib(包含 libcrypto.a (和include(包含头文件(。CMake 代码:

add_library( # Sets the name of the library.
             native-lib
             # Sets the library as a shared library.
             SHARED
             # Provides a relative path to your source file(s).
             src/main/cpp/native-lib.cpp )
add_library(crypto STATIC IMPORTED)
set_target_properties(crypto
  PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/lib/libcrypto.a)
target_link_libraries( # Specifies the target library.
                       native-lib
                       crypto
                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib})

在我自己的native-lib我想使用libcrypto.a.但是当我想导入头文件f.e时。 #include "openssl/md5.h" Android Studio 看不到该文件。并让我包含来自不同 abis 的三个文件之一:

"../../../libs/x86/include/openssl/md5.h"
"../../../libs/armeabi/include/openssl/md5.h"
"../../../libs/armeabi-v7a/include/openssl/md5.h"

有没有办法创建我的库的一个版本(native-lib(,只包含 1 个标题并让 android 工作室自动选择 abi?

喜欢:

#include "openssl/md5.h"

但同时使用 3 个 ABI 版本。或者我应该使用预构建的包含库而不是那样?

#EDIT1

target_include_directories(crypto INTERFACE ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/include)

不工作,收到CMake错误。

在此之前,我用过

target_include_directories(${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/include/)

您需要添加一个包含目录,以便编译器可以找到openssl/md5.h

最惯用的方法是:

target_include_directories(crypto INTERFACE
    ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/include)

不幸的是,CMake 很愚蠢,实际上还不允许你在导入的库目标上执行此操作,所以你必须手动设置属性,如下所示:

set_target_properties(crypto
    PROPERTIES
    IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/lib/libcrypto.a
    INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/include
)

这将包含目录添加到加密接口中,这意味着在构建本机库时也会使用它,因为前面带有 INTERFACE 的属性会传播给该目标的用户。使用 INTERFACE 属性是 CMake 中将使用要求传播到库使用者的自然方式。

您能否尝试以下代码之一:

include_directories("${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/include")

target_include_directories(native-lib "${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/include")

如果我没记错的话,target_include_directories将文件包含在特定目标中。由于您要在native-lib文件中导入头文件,因此target_include_directories必须将native-lib对准。而不是crypto.这些头文件不是crypto...但要native-lib.

对于任何情况,您都可以设置include_directories,将这些头文件添加到所有目标(native-libcrypto(。

另外,请记住:

1 - 编辑您的 CMake列表.txt

2 - 执行项目同步

3 - 只有在之后,打开您的native-lib.cpp文件并尝试再次导入文件头文件。