AndroidStudio3.0NDK輸出多個so庫

個人博客地址 http://dandanlove.com/

前言

去年的 Android之NDK開發(fā)初體驗 這篇文章講述NDK開發(fā)環(huán)境的搭建,以及在AndroidStudio3.0版本之前的NKDK簡單開發(fā)。這次升級到Android Studio3.1,再次嘗試NDK發(fā)現按照之前方法進行so生成會出現一些問題,寫的文章已經不是普遍適用了。

Error: Your project contains C files but it is not using a supported native
To continue using the deprecated NDK compile for another 60 days, set   
android.deprecatedNdkCompileLease=1523451155771 in gradle.properties 

gradle.properties文件尾部添加android.useDeprecatedNdk=true出現第二個錯誤,在gradle.properties文件尾部添加android.deprecatedNdkCompileLease=1523451155771出現第一個錯誤。

AndroidStudio3.1使用CMake簡單操作

這部分相關的文章有很多,我推薦一篇寫的比較詳細的博文: Android Studio3.0開發(fā)JNI流程------JNI入門級。

  • 首先下載CMake,可以通過SDK-Mananger->SDK-Tools來下載CMake。
  • 然后添加C++ Support,這個要在新建項目的時侯,選擇Include C++ Support就可以。
  • 然后項目自己創(chuàng)建后會生成Java類、cpp文件,自己編譯生成so庫直接運行項目就OK了。

CMake的使用

  • 使用CMake只需要修改cpp文件和CMakeLists.txt。
  • CMake生成的cpp文件位于app/src/main/cpp目錄,并且cpp文件不需要再引入java類的h文件。
  • CMakeLists.txt位于app目錄下

CMakeLists.txt

# 有關使用CMake在Android Studio的更多信息,請閱讀文檔:https://d.android.com/studio/projects/add-native-code.html

# 設置CMake的最低版本構建本機所需庫
cmake_minimum_required(VERSION 3.4.1)

# 創(chuàng)建并命名庫,將其設置為靜態(tài)的
# 或共享,并提供其源代碼的相對路徑。
# 你可以定義多個library庫,并使用CMake來構建。
# Gradle會自動將包共享庫關聯到你的apk程序。
# 添加庫
add_library( # 設置庫的名稱
             native-lib
             # 將庫設置為共享庫。
             SHARED
             # 為源文件提供一個相對路徑。
             src/main/cpp/native-lib.cpp )
# (導入系統(tǒng)庫)搜索指定預先構建的庫和存儲路徑變量。因為CMake包括系統(tǒng)庫搜索路徑中默認情況下,只需要指定想添加公共NDK庫的名稱,在CMake驗證庫之前存在完成構建
find_library( # 設置path變量的名稱
              log-lib
              # 在CMake定位前指定的NDK庫名稱
              log )
# (鏈接目標庫)指定庫CMake應該鏈接到目標庫中,可以鏈接多個庫,比如定義庫,構建腳本,預先構建的第三方庫或者系統(tǒng)庫
target_link_libraries( # 指定目標庫
                       native-lib
                       # 目標庫到日志庫的鏈接 包含在NDK
                       ${log-lib} )

添加native方法

添加native方法.png

Alt+Enter快捷鍵自動創(chuàng)建C++方法,不需要頭文件。

生成多個so文件

  • java層多次加載so庫
// Used to load the 'native-lib' library on application startup.
static {
    System.loadLibrary("native-lib");
}
public class JNIUitls {
    static {
        System.loadLibrary("jnilib");
    }

    public static native String getNameString();

    public native int getNumber();
}
  • 在cpp目錄下創(chuàng)建對應的.cpp文件
  • 在CmakeLists.txt文件中對應添加so庫和鏈接so庫
#添加庫
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(jnilib SHARED src/main/cpp/jnilib.cpp)

#導入系統(tǒng)庫
find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

#鏈接目標庫
target_link_libraries( # Specifies the target library.
                       native-lib
                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )
#鏈接目標庫
target_link_libraries(jnilib ${log-lib})
so.png

項目地址:[JNIApplication]
(https://github.com/stven0king/JNIApplication.git)

文章到這里就全部講述完啦,若有其他需要交流的可以留言哦!!

想閱讀作者的更多文章,可以查看我 個人博客 和公共號:

振興書城

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容