NDK 編譯可執行程序


以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

好,我們試試看


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM