在AndroidStudio下使用cmake編譯出靜態連結庫的方法

amlloc發表於2019-02-18

這個是個巨坑,目前還沒有找到真正有效的方法利用cmake的途徑獲取適用於Android平臺下的.a檔案,但找到一個比較討巧的方法,是在stackoverflow上面看到的一位外國人自問自答。

環境:

  • Android Studio 3.2.1
  • cmake3.6.4111459

首先得到的是預設的CMakeLists.txt如下:

cmake_minimum_required(VERSION 3.4.1)

add_library( 
        native-lib
        SHARED
        src/main/cpp/native-lib.cpp)

find_library( 
        log-lib
        log)

target_link_libraries( 
        native-lib
        ${log-lib})
複製程式碼

如果我們將SHARED變為STATIC,事實上我們將不會得到任何的庫檔案(不僅僅.a,連.so檔案都沒有),個人認為出現這麼不方便的問題應該是AndroiStudio或Gradle的問題。

解決問題的方法如下:

使用上面的程式碼我們已經可以得到.so檔案了,然後我們加入以下程式碼獲得.a檔案,並使用和獲得.so檔案時使用的原始檔一樣:

add_library(
        native-lib-static
        STATIC
        src/main/cpp/native-lib.cpp
)
複製程式碼

native-lib-static可以換成任何你想要的名稱,但是不可以是和動態連結庫的名稱一樣。

然後再修改你的target_link_libraries如下

target_link_libraries(
        native-lib
        native-lib-static
        ${log-lib})
複製程式碼

再構建專案:

Gradle->app->build->assembleDebug/assembleRelease
複製程式碼

最後你就可以在app\.externalNativeBuild\cmake\debug(release)\<abi>\libnative-lib-static.a獲得你想要的.a檔案了。

1547193544148

期待谷歌能對這塊改善一下吧,over

相關文章