2017-05-09 63 views
2

我的場景很簡單。我有一個本地庫,我使用CMake的externalNativeBuild系統進行編譯。這適用於構建我的應用程序,但我希望在機器本地(即非仿真器)單元測試期間加載相同的庫。如何使用Gradle NDK構建爲主機編譯?

如果我有一個現有的Gradle NDK設置,包括以下內容,是否有重用此方法來編譯主機操作系統庫(例如macOS)的方法?

defaultConfig { 
    ndk { 
     abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a' 
    } 

    externalNativeBuild { 
     cmake { 
      arguments '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=c++_static' 
     } 
    } 
} 

externalNativeBuild { 
    cmake { 
     path 'CMakeLists.txt' 
    } 
} 

回答

-1

你不知道。 NDK僅針對Android。

+0

它可能會「瞄準」Android,但我使用buck來構建機器本地二進制文件,它工作得很好。這裏的問題是我如何使用gradle toolchain來實現同樣的事情。 – passy

+0

是的,但Android的gradle支持僅適用於_only_ Android(至少在涉及C++時,我實際上並不瞭解Java)。如果你想爲gradle中的其他系統構建C++,我想你最終可能會編寫一個或多或少的單獨構建文件:https://docs.gradle.org/current/userguide/native_software.html –

1

我也對這個主題做了一些研究,沒有相當數量的手工工作是不可能的。下面是我想到的:

不幸的是,除了Gradle的Aadroid插件通過調用CMake或ndk-build專門爲Android項目提供的外,沒有對Gradle的開箱即用的支持。

最簡單的方法似乎是調用CMake和另一個構建主機二進制文件的工具鏈。您可以通過直接使用主機工具鏈調用Cmake或向Gradle添加一些自定義任務來爲您做到這一點。

用C

單元測試如果你想進行單元測試C代碼而已,你可以有CMake的編譯使用您平常庫,並測試其可執行文件。在Java中

單元測試

如果你想要做它通過JNI調用C代碼,你也有移動的庫的Java代碼級別的測試,其CMake的在爲正確的位置輸出JVM在嘗試加載本機庫時找到它。

解決這個問題對人類

IMO這一切的是更難比它應該是。 其他的替代品,這將使它更難試圖

  1. 編譯/解釋你的C代碼,因此它在JVM上運行或
  2. 調用通過JNI一個CPU模擬器運行於Android的二進制文件

如果有人在實施第二項建議時採取了一些措施,那麼對於Android生態系統來說這將會非常有趣。