2012-04-22 96 views
1

我試圖在Android上構建本機守護程序。控制某些特定硬件的目的和Java應用程序將能夠使用套接字與此守護程序進行通信。NDK構建僅適用於C++的應用程序

我一直在使用cmake編譯我的庫,演示程序和真正的守護進程(它工作正常BTW)。我現在試圖做兩件不同的事情:

  1. 使用ndk-build構建相同的應用程序。
  2. 通過使JNI調用與C++守護進程非常相似,將C++守護進程移植到Android服務。

據我所知,ndk-build不能生成本地應用程序,但只能生成本地庫,而這又可以通過Java GUI加載......我是否正確?對於step1我並不真的需要java(我已經證明它已經),但我還沒有找到一種方法讓ndk-build吐出一個精靈應用程序。

僅供參考 - 我使用cmake,如下所述:http://opekar.blogspot.com/2011/06/android-cmake-is-much-easier-in-ndk-r5b.html

這樣我可以有用於建立「正常」的Linux和Android的同時使用了源建立。如果你問我,那很好。

回答

1

正如在評論中提及了由@馬丁斯Možeik,這PICE的Android.mk將工作:

LOCAL_PATH  := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE  := my_daemon 
LOCAL_C_INCLUDES := src 
LOCAL_SRC_FILES := src/daemon.c 
include $(BUILD_EXECUTABLE) 

有一件事我注意到的是,通過這種「Makefile文件」所產生的二進制是130K,而cmake生成的二進制文件是〜40 kb。這是因爲我使用-s作爲C_FLAG,然後gcc將在運行中剝離生成的對象。稍後可以通過撥打$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-strip或相應的鋼帶來完成此操作。

由於我沒有發現這個功能的文檔在互聯網上,一些話:

  • 這工作挺好的,這裏沒有問題:)
  • 這必須保存在一個名爲jni/Android.mk文件。
  • 代碼必須保存在JNI目錄內
  • 如果你的代碼是jni目錄這讓醜陋之外,但並非不可能。您只需要在代碼前加上相應的前綴,不要忘記修改包含路徑。這是留給讀者的一個練習。
  • 仍然不確定爲什麼從Android構建系統生成的代碼大於由cmake生成的代碼。我之前說過strip未被調用 - 但是它在* .so被複制到lib目錄之前調用。
  • 仍然不知道如何將該二進制文件打包到android軟件包中,甚至不知道如何在不修改Android代碼的情況下運行它(例如系統啓動時)。我假設我可以編寫一個在啓動時啓動的Java服務,然後是守護進程execvp
+0

請注意,Bionic(Android libc)對C++異常處理的支持有限,所以您可能需要重新考慮端口。參考:http://en.wikipedia.org/wiki/Bionic_%28software%29 – Samveen 2012-04-27 10:27:43

0

您的選擇2是唯一的方法來做它AFAIK。

+0

我不反對黑客構建系統吐出二進制文件的選項。 – elcuco 2012-04-22 08:19:18

+0

@Eluco:我還是認爲沒有黑客攻擊android本身就沒有可能。 – Goz 2012-04-22 08:31:43

+0

那麼什麼是「$ NDK/build/code/build-biary.mk」? – elcuco 2012-04-22 08:38:29

2

另一種方法是使用與NDK捆綁在一起的腳本make-standalone-toolchain.sh創建一個獨立的工具鏈,然後用它來編譯您的項目。下面的shell代碼演示瞭如何使用它:

# Assumed path to the NDK, change it to suit your environment. 
NDK_HOME=$HOME/bin/android-ndk-r8e 

# Desired API and NDK versions and destination folder of 
# the stand-alone toolchain, change them to suit your needs. 
api=14 
ver=4.7 
folder=$HOME/bin/android-$api-ndk-$ver 

mkdir $folder 
cd $folder 

$NDK_HOME/build/tools/make-standalone-toolchain.sh \ 
    --toolchain=arm-linux-androideabi-$ver \ 
    --platform=android-$api --install-dir=$(pwd) 

運行上述線路將在$HOME/bin/android-14-ndk-4.7產生新的獨立的工具鏈,然後你就可以如同使用普通的C/C++交叉編譯工具鏈使用。

使用獨立工具鏈的優勢在於它可以輕鬆地將Linux項目交叉編譯爲Android;例如見我的port of Valgrind to Android ARMv7

相關問題