2017-08-30 216 views
0

我對Android和NDK/CMake很新穎。不過,我試圖將一個本地CMake庫嵌入到Android應用程序中。但是,這個庫依賴於OpenSSL。Android CMake:找不到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

使用此:[鏈接](https://stackoverflow.com/questions/11896304/openssl-is-not-recognized-as-an-internal-or-external-command/44199907 #44199907)它會幫助你... –

回答

1

find_package(...)搜索在幾個標準位置庫(讀here - 搜索「的搜索結果在cmake的指定路徑」)。在你的情況下,它會失敗,因爲它無法在你想要交叉編譯Android代碼的機器上找到OpenSSL。

我知道,我也對我的本地C++ Android的代碼,我設法它使它工作的唯一途徑鏈接OpenSSL的各種嘗試,爲以下:

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}) 

我知道,我也試圖使find_package可以正常工作,通過使用它的一些配置屬性,如CMAKE_FIND_ROOT_PATH等一些方法,但我無法完成。

不知道我提供的解決方案是否是最好的方法,cmake方式。也許有人有更好的方式去做,但唉,它當時解決了我的問題。

希望這有助於

+0

謝謝,我試過你的方法。不幸的是我收到相同的錯誤信息。我只將'ADD_LIBRARY'改成'add_subdirectory(庫) add_library(library $ {library_srcs})' – dominik

+0

啊,我明白了。你暗示'find_package(...)'根本不起作用。在這種情況下,我必須編輯'library/CMakeLists.txt'並刪除'find_package'吧? – dominik

+0

好吧,使用這種方法我建議你不需要find_package,而不是OpenSSL,因爲你正在爲OpenSSL手動提供數學。如果你需要其他東西,比如OpenGL – cjurjiu