我对使用NDK / CMake的Android非常陌生。但是,我试图将原生CMake库嵌入到Android应用程序中。但是,这个库依赖于OpenSSL。
这就是我为Android下载预编译版OpenSSL的原因。
但是,当我尝试同步项目时,我收到以下错误:
Could NOT find OpenSSL, try to set the path to OpenSSL root folder
in the system variable OPENSSL_ROOT_DIR (missing: OPENSSL_LIBRARIES)
(found version "1.1.0f")
这是我的(最小)项目结构
<app-name>
-app
- src
- main
- cpp
- library
- CMakeLists.txt
CMakeLists.txt
- distribution
- openssl
- armeabi
- include
- openssl
...
- lib
libcrypto.a, libssl.a
在我的build.gradle中,我定义了以下内容:
externalNativeBuild {
cmake {
path 'src/main/cpp/CMakeLists.txt'
}
}
/app/src/main/cpp/CmakeLists.txt如下所示:
cmake_minimum_required(VERSION 3.4.1)
set(distribution_DIR ${CMAKE_SOURCE_DIR}/../../../../distribution)
set(OPENSSL_ROOT_DIR ${distribution_DIR}/openssl/${ANDROID_ABI})
set(OPENSSL_LIBRARIES "${OPENSSL_ROOT_DIR}/lib")
set(OPENSSL_INCLUDE_DIR ${OPENSSL_ROOT_DIR}/include)
message("OPENSSL_LIBRARIES ${OPENSSL_LIBRARIES}")
message("OPENSSL_INCLUDE_DIR ${OPENSSL_INCLUDE_DIR}")
find_package(OpenSSL REQUIRED)
add_subdirectory(library)
答案 0 :(得分:1)
find_package(...)
在几个标准位置搜索图书馆(阅读here - 搜索&#34;在cmake&#34;中指定的搜索路径)。在您的情况下,它失败了,因为它无法在您尝试交叉编译Android代码的计算机上找到OpenSSL。
我知道我也尝试过将OpenSSL与我的原生c ++ Android代码相关联,而我管理它的唯一方法就是使用它,如下所示:
SET(distribution_DIR ${CMAKE_SOURCE_DIR}/../../../../distribution)
SET(OPENSSL_ROOT_DIR ${distribution_DIR}/openssl/${ANDROID_ABI})
SET(OPENSSL_LIBRARIES_DIR "${OPENSSL_ROOT_DIR}/lib")
SET(OPENSSL_INCLUDE_DIR ${OPENSSL_ROOT_DIR}/include)
SET(OPENSSL_LIBRARIES "ssl" "crypto")
#<----Other cmake code/defines here--->
LINK_DIRECTORIES(${OPENSSL_LIBRARIES_DIR})
ADD_LIBRARY(library #your other params here#)
TARGET_INCLUDE_DIRECTORIES(library PUBLIC ${OPENSSL_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(library ${OPENSSL_LIBRARIES})
我知道我也尝试通过使用一些配置属性(例如CMAKE_FIND_ROOT_PATH
)以及其他一些方法来使find_package正常工作,但我无法完成它。
不知道我提供的解决方案是否是最好的方法,cmake-wise。也许有人有更好的方法,但唉,它解决了我当时的问题。
希望这有帮助
答案 1 :(得分:0)
未找到OpenSSL的原因是因为所有find_*()
命令还依赖于变量CMAKE_SYSROOT
变量,该变量用于给那些命令搜索的路径添加前缀。在交叉编译以指向目标环境的根目录时使用。
一种解决方案是将OpenSSL所在的路径添加到CMAKE_FIND_ROOT_PATH
; find_library()
的文档说明:
CMake变量CMAKE_FIND_ROOT_PATH指定一个或多个 目录要放在所有其他搜索目录的前面。这个 有效地“重新植根”给定位置下的整个搜索。
此解决方案对我有用:
set(OPENSSL_ROOT_DIR "/path/to/openssl/for/android")
list(APPEND CMAKE_FIND_ROOT_PATH "${OPENSSL_ROOT_DIR}")
find_package(OpenSSL)