Android Studio 加載第三方C/C++庫

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源碼頭文件"}的方式。


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章