以Hello Android工程為例。
建立好工程
hello-a
,在
jni
目錄下創建文件
hello-a.c,
文件內容如下。(注意是jni目錄,使用src目錄編譯會出錯)
#include <stdio.h> int main() { printf("Hello Android!\n"); return 0; }
在該目錄下,創建
Android.mk
文件,內容如下:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE:= helloa LOCAL_SRC_FILES := hello-a.c include $(BUILD_EXECUTABLE)
這里需要注意的上面紅色部分,指定我們現在要生成一個可執行的文件。
在工程下運行
ndk-build
,結果提示錯誤:

這個提示告訴我們,在工程中沒有找到
AndroidManifest.xml文件。若創建了
Java
應用程序,會自動生成該文件。在該文件中,
描述了程序包的一個全局變量,包括應用組件(activities, services等等)和為每個組件的實現類,什么樣的數據可以操作,以及在什么地方運行。而這里,我們根本不需要這個文件。那么為什么會有這樣的錯誤提示呢?
其實這個和NDK的版本有關系。現在最新的版本,就是我用的版本NDK r4版,與之前的版本,一個很大的改變,就是對工程源文件路徑及組織結構的變化。在NDK r3版,按裝NDK后,需要運行setup.sh來創建編譯環境,需要在<NDK>APPS/目錄下,創建同名的工程,然后添加Application.mk,然后編譯的時候,執行make APP=yourproject。新的版本不需要再去創建這個同名的app工程,直接用編譯工具ndk-build就可以了。這個工具實際上是對build編譯工具的一層封裝,每次編譯都會自動去設置一次編譯環境,然后調用工程中的Android.mk來進行工程的編譯,原來的那個Application.mk也不是必須的了,只有在需要的時候,才去創建。不過相比前一版本,就是增加了對AndroidManifest.xml文件的檢查。
我們如何解決這個問題呢?有兩個辦法:一是手動創建一個AndroidManifest.xml文件,然后里面內容為空項就行,如
<?xml version="1.0" encoding="utf-8"?> <manifest/>
我們再次運行
ndk-build
,成功。

我們試試可否正常運行:

看到了
Hello Android!
成功了。
這種方法雖然解決了問題,但是並沒有理解問題的實質。好,保持求知的強勁勢頭和欲望,這就有了第二種解決辦法。
我們先來看看開發者對這個問題的描述:
“Themanifest is only required to find the top-level of your project path(ndk-build can be invoked in any sub-directory of your project).”
那么,我們只要在編譯前指定工程路徑就行了,如何做呢?簡單!
ndk-build NDK_PROJECT_PATH=/path/to/project
好,我們試試看
