NDK 編譯報錯 SIMPLE: Error configuring

首先項目肯定沒問題,去年寫的好好的項目,今天 clone 下來根本跑不起來,編譯直接報錯:SIMPLE: Error configuring,除此以外沒有任何信息,網上的資料很少,也基本上都沒什麼用。

一、 發現問題

先來看下奇葩的報錯:

有沒有搞錯,我肯定知道配置錯誤啊,但你一點提示都不給啊!

二、定位問題

我們要搞點事情,根據多年工作經驗 assemble 一下,assembleassembleDebugassembleRelease 這些運行哪個都無所謂,我們只要拿到編譯時的日誌。

日誌來了,我們只關注紅色 Error 信息:

這就是關鍵信息了:

CMake Error: CMake was unable to find a build program corresponding to "Ninja".
CMAKE_MAKE_PROGRAM is not set.  You probably need to select a different build tool.

意思大致是,CMake 不能找到 Ninja 構建程序,沒有設置 CMAKE_MAKE_PROGRAM。

三、分析問題

趕時間,可以跳過,直接看第四步。

Ninja 這東西確實沒有用過,也沒有安裝過,網上其它文章的解決辦法,基本都是對 Ninja 下手,太狠了!

但是,我寫的項目怎麼可能問題!況且,新建一個 NDK 項目都可以跑起來,肯定是其它不可抗力。


我可不想隨便裝個不瞭解的 Ninja 就草草了事,改 bug 使我快樂,下面就將兩個項目對比一下。

  1. CMakeLists.txt
    首先看它,因爲是 CMake 構建失敗。檢查結果沒有問題。

  2. build.gradle
    這個是 Module 下的 build.gradle,因爲這裏對 CMake 進行了配置。檢查結果沒有問題。

  3. gradle
    由於之前項目是正常的,現在構建出問題,根據多年工作經驗,很有可能是 gradle 升級後出現的問題。

    需要修改兩個地方

    • gradle-wrapper.properties 文件的 distributionUrl 地址修改爲可運行的項目中的。
    • build.gradle(這個是項目的,也就是外層的)文件的 classpath 修改爲可運行的項目中的。

      修改完上面兩個文件,再次編譯正常,運行正常。

運氣比較好,很快就解決問題了,分析這類問題的思路,一般還可以從 NDK 版本、CMake 版本入手,我後面嘗試了不修改 gradle,只降低 NDK 版本,還是不能正常編譯的,說明並不是 NDK 版本問題。

四、解決問題

先說下我的環境,Android Studio 3.4.1,NDK r19c,CMake 3.10.2

  1. 修改 gradle-wrapper.properties 文件
    修改 distributionUrl,改爲你能運行的其它項目的內容,構建時會按照這個地址下載 gradle。
#Wed May 29 18:30:37 CST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
# 改爲你能運行的其它項目的內容,構建時會按照這個地址,下載gradle
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
  1. 修改外層 build.gradle
    修改 classpath,這裏需要修改爲你能運行的其它項目的內容,這個是 gradle 插件版本,這個版本一般與Android Studio 的版本一致。
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    
    repositories {
        google()
        jcenter()
    }
    dependencies {
        // 改爲你能運行的其它項目的內容,這個是 gradle 插件版本,一般與Android一般與Android Studio 的版本一致。
        classpath 'com.android.tools.build:gradle:3.4.1'
        

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

五、最後

其實構建、編譯失敗都是很好解決的,關鍵還是分析的思路。

現在網絡很發達,不要一味相信那些解決辦法,要抱着質疑的態度,多搜索,多嘗試。

就像遇到這個的問題,大多數人一頓操作猛如虎,噼裏啪啦幾個命令,裝上了 Ninja,根本原因其實沒有解決,就算解決了,絕大多數人也不會去了解 Ninja 是什麼。

當然我的解決辦法不一定適用於你,也要帶着質疑的眼光去嘗試,這樣才能不斷進步。

好了,我要跑去 Ninja 那邊看一眼了:使用 Ninja 代替 make

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