1 修改app目錄下的CMakeLists.tx
- 添加目標庫
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 ) # 依賴的源碼文件
- 設置依賴頭文件路徑
include_directories(src/main/cpp)
- 導入第三方庫
add_library(
hello-lib #需要導入第三方庫的別名,自定義。
SHARED #動態庫
IMPORTED) #因爲庫已經存在所以使用導入
- 設置第三庫的所在路徑
set_target_properties( # Specifies the target library.
hello-lib
# Specifies the parameter you want to define.
PROPERTIES IMPORTED_LOCATION
# Provides the path to the library you want to import.
# /${ANDROID_ABI}表示處理器架構 第三方庫必須存放在這類路徑下
#如果有第三方庫不支持或目標不需要支持的處理器架構,需要在app目錄下的
#build.gradle文件中進行配置
#路徑一定要設置正確,不然會報依賴錯誤
${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libpsamcard.so )
- 將第三方庫與目標庫進行關聯
target_link_libraries( # Specifies the target library.
native-lib
# Links the target library to the log library
# included in the NDK.
hello-lib
${log-lib} )
2修改app目錄下的build.gradle
- 安卓系統支持系統結構有好幾種,所以在使用Android Studio生成SO庫時,如果不加指定說明,那麼將默認生成幾種架構下的so庫,如果依賴的第三方庫缺少某個架構的so庫,編譯器就會報錯。所以我們希望生成的目標架構的so庫必須是第三方庫包含的。如果不包含,就需要對編譯規則進行設置。
- app的gradle的defaultConfig裏面加上
ndk {
abiFilters "armeabi" // 指定要ndk需要兼容的架構(這樣其他依賴包裏mips,x86,"armeabi-v7a",arm-v8之類的so會被過濾掉)
}
如此我們編譯鏈接生成的so庫就只包含armeabi架構的,而其他架構的則不包含。
3編譯生成目標庫
- 點擊工具欄中的Build選擇Make Project,編譯完成後,我們就可以得到我們需要的庫。
生成的so庫存放路徑.png
我們可以把obj目錄下的文件夾和文件一起拷貝出來給其他工程使用。
4 C/C++混合編程需要注意的事項
- 當我們在C++的源碼文件中直接調用C源碼中的方法,編譯過程中會報無法發現C方法的問題,導致鏈接失敗。
- 我們需要在C++源碼或包含的C源碼頭文件中將需要調用的C方法聲明用 extern "C" { C方法聲明列表 } 或者我們可以在C++源碼中使用 extern "C" {include "c源碼頭文件"}的方式。