1. 程式人生 > >使用NDK編譯並執行C++11的Command line命令列程式

使用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的庫

C++11APP_STL := gnustl_static