使用NDK編譯並執行C++11的Command line命令列程式
用C++11寫了一個併發的類,使用了lock-free的演算法。需要在跨平臺(PC、android)執行一個測試程式,測試在不同CPU上是否穩定。
在android上,涉及到如何使用NDK編譯和執行命令列程式以及如何使用NDK編譯支援C++11的程式這兩個問題。
以下使用android-ndk-r10d,在windows上執行。
一、如何使用NDK編譯和執行命令列程式
在NDK的sample中有例子,比如test-libstdc++。
關鍵點有:
1、在myproject目錄下建立jni目錄
2、jni目錄建立Application.mk和Android.mk兩個編譯配置檔案
2.1 在android.mk 設定編譯目標是可執行檔案:
include $(BUILD_EXECUTABLE)
2.2 注意按照步驟3執行ndk-build時,android.mk 中的LOCAL_PATH是包含了jni路徑,而在編譯程式碼檔案時,也會帶jni。所以:
LOCAL_PATH := $(call my-dir)
#MY_SRC_PATH 不能寫成$(LOCAL_PATH)../../../src,否則會提示找不到jni/jni/.....的檔案了
MY_SRC_PATH := ../../../src
#但是MY_INCLUDE_PATH還是要帶LOCAL_PATH,否則找不到標頭檔案。
MY_INCLUDE_PATH := $(LOCAL_PATH)/../../../include
3、在myproject目錄執行ndk-build,生成可執行檔案
4、使用adb push 把生成的可執行檔案拷貝到手機上
5、使用adb shell 登入到手機上,chmod修改檔案的屬性,加上“執行”許可權
6、執行檔案。
二、如何使用NDK編譯C++11的應用程式
NDK提供多個toolchain和C++的支援庫。不同版本支援的特性不同。
1、toolchain
先說toolchain,首先不同的cpu有不同的toolchain,比如arm的toolchain,x86的toolchain。
在同一個平臺,根據不同的編譯器可以繼續細分,比如arm的toolchain又分成使用gcc來編譯或者使用Clang來編譯。
同一類編譯器還有不同的版本,比如arm gcc的編譯器又有4.6 4.8等不同的版本。
所以,要支援C++11,首先要選擇一個支援C++11語法的編譯器
2、關於執行時庫
C++11包括很多標準庫,比如<thread>,<atomic>。NDK提供了很多個C++的執行庫,不同執行庫支援的功能不同。
預設使用的執行時庫叫system,功能很有效。除system之外,還有stlport,gabi++,gnu stl,llvm libc++等不同版本。
同一個版本的庫,比如gnu stl,又可以分成靜態庫,動態庫等。
所以,還要根據應用需求,選擇合適的執行時庫
3、配置Application.mk
選擇支援的編譯器版本,選擇支援的執行時庫。這兩個選項都在Application.mk中。比如:
#選擇toolchain。使用GCC的4.8版本,4.9應該也是可以的,但是4.6不支援thread等。clang3.4和clang3.5也是可以的
NDK_TOOLCHAIN_VERSION := 4.8
#選擇執行庫。使用libstdC++的靜態庫。使用gnu stl的庫
APP_STL := gnustl_staticC++11