個人博客地址 http://dandanlove.com/
前言
去年的 Android之NDK開發(fā)初體驗 這篇文章講述NDK開發(fā)環(huán)境的搭建妒蛇,以及在AndroidStudio3.0版本之前的NKDK簡單開發(fā)米愿。這次升級到Android Studio3.1崔涂,再次嘗試NDK發(fā)現(xiàn)按照之前方法進行so生成會出現(xiàn)一些問題,寫的文章已經(jīng)不是普遍適用了。
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
出現(xiàn)第二個錯誤,在gradle.properties
文件尾部添加android.deprecatedNdkCompileLease=1523451155771
出現(xiàn)第一個錯誤。
AndroidStudio3.1使用CMake簡單操作
這部分相關(guān)的文章有很多换帜,我推薦一篇寫的比較詳細(xì)的博文: 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
# 有關(guān)使用CMake在Android Studio的更多信息,請閱讀文檔:https://d.android.com/studio/projects/add-native-code.html
# 設(shè)置CMake的最低版本構(gòu)建本機所需庫
cmake_minimum_required(VERSION 3.4.1)
# 創(chuàng)建并命名庫乡恕,將其設(shè)置為靜態(tài)的
# 或共享,并提供其源代碼的相對路徑俯萎。
# 你可以定義多個library庫傲宜,并使用CMake來構(gòu)建。
# Gradle會自動將包共享庫關(guān)聯(lián)到你的apk程序讯屈。
# 添加庫
add_library( # 設(shè)置庫的名稱
native-lib
# 將庫設(shè)置為共享庫蛋哭。
SHARED
# 為源文件提供一個相對路徑。
src/main/cpp/native-lib.cpp )
# (導(dǎo)入系統(tǒng)庫)搜索指定預(yù)先構(gòu)建的庫和存儲路徑變量涮母。因為CMake包括系統(tǒng)庫搜索路徑中默認(rèn)情況下,只需要指定想添加公共NDK庫的名稱谆趾,在CMake驗證庫之前存在完成構(gòu)建
find_library( # 設(shè)置path變量的名稱
log-lib
# 在CMake定位前指定的NDK庫名稱
log )
# (鏈接目標(biāo)庫)指定庫CMake應(yīng)該鏈接到目標(biāo)庫中,可以鏈接多個庫叛本,比如定義庫沪蓬,構(gòu)建腳本,預(yù)先構(gòu)建的第三方庫或者系統(tǒng)庫
target_link_libraries( # 指定目標(biāo)庫
native-lib
# 目標(biāo)庫到日志庫的鏈接 包含在NDK
${log-lib} )
添加native方法
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)建對應(yīng)的.cpp文件
- 在CmakeLists.txt文件中對應(yīng)添加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)
#導(dǎo)入系統(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 )
#鏈接目標(biāo)庫
target_link_libraries( # Specifies the target library.
native-lib
# Links the target library to the log library
# included in the NDK.
${log-lib} )
#鏈接目標(biāo)庫
target_link_libraries(jnilib ${log-lib})
項目地址:[JNIApplication]
(https://github.com/stven0king/JNIApplication.git)
文章到這里就全部講述完啦,若有其他需要交流的可以留言哦营搅!云挟!
想閱讀作者的更多文章,可以查看我 個人博客 和公共號: