2012-11-15 40 views
0

我已經掌握了需要爲MIPS設備構建的專有JNI應用程序。我讀過"Initializing a Build Environment",部分NDK文檔,一些Google網上論壇主題和衆多StackOverflow問題,但我仍然沒有回答。爲JNI應用程序設置Android構建環境

到目前爲止,我已經使用Google的回購腳本檢出了Android源代碼,並且在~/AndroidSource之下。我還單獨下載了~/AndroidSDK下的SDK和~/AndroidNDK下的NDK。我正在嘗試構建的代碼位於不同的位置。 SDK和NDK二進制文件在我的路徑中。對於構建,我試圖使用兩個不同版本的NDK以及Android源代碼樹下的版本,並且遇到了不同的問題。我目前的設置使用NDK r8b,從Android源單獨下載。

該應用程序有其Android.mkjni/Android.mk。然而,後者中的若干指令指向如下路徑,如

frameworks/base/include 
system/core/include 

沒有前綴。我認爲這些是爲了指向Android源代碼中的相應目錄,所以我將它們鏈接到當前目錄。經過一些更多的符號鏈接和makefile以及源代碼的黑客入侵之後,我得到了應用程序進行編譯,但我目前停留在鏈接階段,並且有大量缺少方法體的引用。在整個過程中,我知道我做錯了什麼。

我在Linux x86_64主機上,如果有任何問題的話。

所以我的問題是:

什麼是設立JNI應用的編譯環境的正確方法?我應該設置哪些環境變量,符號鏈接和/或路徑擴展?我需要在調用每個ndk-build之前或之前調用任何腳本嗎?

另外,如果你糾正了我錯誤的任何概念或術語,我會很高興。

回答

1

你的方法wiyh符號鏈接的AOSP系統標題樹是正確的。你現在需要的是爲MIPS編譯的系統庫。獲取它們的最簡單方法是從目標設備(或模擬器映像)獲取它們的adb pull。但是您也可以自己構建這些庫,作爲AOSP構建的一部分(請參閱您下載的源代碼樹的構建說明)。

如果仍有問題,請使用參數V=1運行ndk-build併發布鏈接命令及其結果。

+0

我認爲鏈接問題與應用程序代碼構建的庫有關,而不是預先構建在設備上,但現在我無法測試。我不再在該應用程序上工作,並且我的本地Android源與其目標不匹配。然而,我正在尋找「正確的做法」的答案。 – mcmlxxxvi

+0

如果include路徑中包含'frameworks/base/include'和'system/core/include',則很可能會有'-lutils'和'-lcutils'。這兩個庫實際上是無處不在的,但不是NDK附帶的「穩定API」的一部分。 –

1

我在構建(YMMV)中使用以下內容。

  • 明確調用arm-linux-androideabi-gcc作爲您的編譯器或鏈接器(應該在PATH中)。
  • NDK_PLATFORM = /路徑/到/ Android的NDK-R * /平臺/ Android的14
  • 通行證-I"$(NDK_PLATFORM)/arch-arm/usr/include"編譯器
  • 通行證-nostdlib -L"$(NDK_PLATFORM)/arch-arm/usr/lib/" -lgcc -lc -lm到連接
+0

我寧願不走你的路,但鏈接器標誌看起來很有用 - 我會研究它們的未來版本。 – mcmlxxxvi

+0

@mcmlxxxvi:首先,請注意,您需要用'mipsel-linux-androideabi-gcc'替換'arm-linux-androideabi-gcc',用'arch-mips'替換'arch-asm'。其次,如果在項目中實際使用了這種方法,則無法彌補非公共標題和庫的影響。第三,通常'ndk-build'通常會爲編譯器和鏈接器提供正確和一致的參數。 –

相關問題