2017-01-21 87 views
4

我有一個C++代碼庫,當前在Visual Studio中設置(在Windows上運行),多個項目具有相互依賴關係。我試圖將其轉移到Android Studio,以使其在Android上運行。 我對Visual Studio和C++很熟悉,但是對於Android Studio的Gradle和CMake來說還是很新的。Android Studio中的多個本機模塊

我的(可能是錯誤的)期望是嘗試和對待Android Studio項目,如Visual Studio Solutions和Android Studio模塊,如Visual Studio Projects。鑑於我的代碼庫在Visual Studio中使用多個項目,我正嘗試在Android Studio中創建多個模塊 - 每個模塊都有自己的build.gradleCMakeLists.txt文件。

問題是我無法獲得一段代碼(AS模塊)與其他鏈接。我正在使用add_library()編譯這些不同的部分爲STATIC(我打算讓一個模塊創建SHARED庫,以加載到Java中)。

我可以很容易地通過include_directories("../OtherModule/src/")獲得包括工作。但是,我無法將其鏈接。我找不到要鏈接到的.so(或類似)文件(通過target_link_libraries()或同等文件)。當我從給定的模塊中提取.arr文件時,我沒有看到任何.so或任何東西。

我知道我可以簡單地把整個基本代碼下一個模塊(使用一個build.gradle和一個CMakeLists.txt - 或網絡的使用add_subdirectory()CMakeLists.txt「S)。我不知道這是否正確,或者是否需要更多/更少的時間來構建。

我相信可以有多種方式來設置它,它可能只是一個偏好問題。到目前爲止,我所做的所有研究都只發現使用Java代碼嚴格將本地代碼添加到相同的模塊 - 執行基本的JNI本機橋接器。我一直無法找到關於多個本地模塊鏈接在一起的單篇文章。

我希望有更多的Android本地開發經驗的人可以幫助我。謝謝!

TL; DR:簡化方案:(不關心JNI本機橋)我在Android Studio中有兩個模塊,都只有本機代碼。我希望每個模塊都有自己的build.gradleCMakeLists.txt,創建自己的STATIC庫。一個模塊依賴於另一個模塊,並且必須設置正確的包含和鏈接目錄。怎麼辦?這是否正確(或者應該只有一個帶有本機代碼的模塊)?

回答

1

我問了一個相關的問題here。在我看來,作爲...

  1. ...實際上並沒有連接最後的模塊庫,除非它是SHARED(它允許靜態「子庫」的模塊內);考慮分享最終的圖書館 - 但你必須專門在Java中使用System.loadLibrary()
  2. ...不允許您將文件安裝到其他位置(例如,從您的本機模塊安裝到您的Android應用程序)。我通過set_target_properties(jniwrapper PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../libnative/build/intermediates/cmake/${BUILD_TYPE}/obj/${ANDROID_ABI}/libnative.so)獲取庫並在build.gradle中設置BUILD_TYPE來解決此問題。不過分優雅。

總的來說,這似乎不是一個鼓勵用例在AS ...

+0

謝謝,這種作品,但它絕對不是理想的。任何人都知道現在是否有更好的解決方法? – Lordalcol