2013-03-25 106 views
71

如何將C++ 11集成到Android中?在Android上啓用C++ 11支持

+0

有沒有必要創建一個新的問題,只需回答你的原始問題。 – LittleBobbyTables 2013-03-25 13:41:41

+9

由於原來的問題是關於使用「unordered_map」,我相信在Android上集成C++ 11會有趣,因爲這花了我一些時間,而且略有不同。很高興在維基問題上得到贊成票,順便說一下;-)。 – JonesV 2013-03-25 13:45:07

+1

gotcha。猜猜有人不喜歡這個問題:| – LittleBobbyTables 2013-03-25 13:46:42

回答

35

首先,你需要確保你的工具鏈是「Cross GCC」。雖然這是我的Linux的默認設置,但它不在我的MacOSX Lion上。

爲此,請轉至項目屬性> C/C++ Build>工具鏈編輯器。 「當前工具鏈」應設置爲「Cross GCC」。您可能需要取消選中「顯示兼容工具鏈」框「。

然後,在Android.mk添加一個選項LOCAL_CFLAGS:

LOCAL_CFLAGS := -std=gnu++11 

現在我們需要告知的Eclipse在哪裏可以找到相應的新符號(例如 「的std :: unordered_map」)。轉到右鍵點擊 「JNI」>屬性> C/C++常規 - >路徑和符號 - >符號 - > GNU C++,並添加以下符號(通過單擊 「添加...」):

Name: __GXX_EXPERIMENTAL_CXX0X__ 
Value: 

(即讓「價值」空)

+0

@ yakk:通常需要2天才能通過。 – moswald 2013-03-25 21:53:30

+0

我遇到了一些問題。我使用Windows,並通過cmd進行編譯。我在make文件中添加了LOCAL_CFLAGS:= -D__GXX_EXPERIMENTAL_CXX0X__ -std = gnu ++ 11,但是當我運行ndk-build命令時,在使用unordered_map的地方出現錯誤('unordered_map'沒有命名類型)。代碼在我的程序的linux和windows端口中工作。任何想法可能是錯誤的?我使用的NDK是最新的(今天下載)。 – SMart 2013-03-31 10:18:41

+3

如果您有多個模塊並且要爲所有文件啓用標誌,則可以將該標誌添加到Application.mk文件中的APP_CPPFLAGS變量中。 – hara 2013-10-15 12:35:15

65

看來主要答覆這裏包括C++ 11的實驗性支持,以及C++ 11是不是實驗了。

如果您使用命令行NDK支持(我使用IDEA社區版13作爲Java的東西),那麼這就是我必須在我的jni/Application.mk中使用API​​ 19(在OSX上獲得C++ 11支持ML):

NDK_TOOLCHAIN_VERSION := 4.8 
# APP_STL := stlport_shared --> does not seem to contain C++11 features 
APP_STL := gnustl_shared 

# Enable c++11 extentions in source code 
APP_CPPFLAGS += -std=c++11 

herehere派生。

+4

這應該是公認的答案。 – stevebot 2015-03-18 19:24:36

7

您還可以,如果你使用的是gradle-experimental-plugin設置這個在您的的build.gradle文件:

android.ndk { 
    moduleName = "hello-android-jni" 
    stl = "stlport_shared" 
    cppFlags.add("-std=c++11") 
} 
+0

這不起作用。它告訴我cppFlags找不到。 – Seth 2017-02-12 19:37:02

+0

嘿@Seth,很多事情可能會出錯,你確定你已經使用了正確版本的gradle插件和正確版本的gradle本身嗎?如果你還沒有閱讀,這是一個很棒的公會。 http://tools.android.com/tech-docs/new-build-system/gradle-experimental – 2017-02-12 21:39:52

+0

謝謝。但不幸的是,我已經閱讀了每一個指南。大聲笑。我只是用'pthread'而不是'thread' – Seth 2017-02-12 22:08:28

1

隨着最新gradle-experimental-plugin 0.8.0-的α4添加到您的應用/的build.gradle

model { 
    android { 
     ndk { 
      moduleName "native" 
      CFlags.add("-std=c11") // Enable C11 support 
      ldLibs.add("log") 
     } 
    } 
}