我对Android的NDK / CMake还很陌生。不过,我正在尝试将一个原生的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'
}
}
下面的代码如下所示:
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)
4条答案
按热度按时间bzzcjhmw1#
find_package(...)
在几个标准位置搜索库(阅读here- search for“Search paths specified in cmake”)。在您的例子中,它失败了,因为它在您试图交叉编译Android代码的机器上找不到OpenSSL。我知道我也尝试过将OpenSSL与我的原生c++ Android代码链接起来,我管理它使其工作的唯一方法是:
我知道我也尝试过使find_package正确工作,通过使用它的一些配置属性,如
CMAKE_FIND_ROOT_PATH
,以及其他一些方法,但我无法完成它。我不知道我提供的解决方案是否是最好的方法,也许有人有更好的方法,但可惜的是,它当时解决了我的问题。
希望这对你有帮助
qlfbtfca2#
找不到OpenSSL的原因是因为所有的
find_*()
命令都依赖于变量CMAKE_SYSROOT
,该变量用于为这些命令搜索的路径添加前缀。在交叉编译时使用该变量指向目标环境的根目录。一种解决方案是将OpenSSL所在的路径添加到
CMAKE_FIND_ROOT_PATH
;find_library()
的文档说明:CMake变量CMAKE_FIND_ROOT_PATH指定了一个或多个要附加到所有其他搜索目录前面的目录。这有效地将整个搜索“重定根”在给定位置下。
此解决方案对我很有效:
jgwigjjp3#
对我来说,通过gradle导入openssl,然后像描述的here那样链接获取的lib是有效的
jyztefdp4#
将
NO_CMAKE_FIND_ROOT_PATH
附加到您的find_*
命令,例如或者将
CMAKE_FIND_ROOT_PATH_MODE_*
变量(如this)设置为NEVER
。以下选项为我修复了macOS上的Android和iOS构建: