2013-06-17 61 views
16

Android NDKでC++ 11スレッディング機能を使用しようとしていますが、最新のコンパイラを使用する方法がわかりません。Androidで最新のC++ 11機能NDK

私はClang 3.2を持っており、iOSアプリケーションを構築できます。 Android NDKでそれを行う方法があるのだろうか?

もしそうでなければ、gcc 4.8を使ってどのようにビルドするのですか?

+0

http://stackoverflow.com/questions/15269496/how-to-compile-c11-code-with-android-ndk-and-eclipseとhttp:// stackoverflow。com/questions/14014659/android-ndk-error-must-be-std-c11-or-std-gnu11コンパイラ – Michael

+0

@Michael、私はclang 3.2またはgcc 4.8でビルドする必要があります。それは不可能であり、pthreadsを使用してください。 – Kimi

+0

NDKリビジョン10d - GCC 4.8はすべての32ビットABIのデフォルトです –

答えて

12

NDKリビジョン10を使用している場合には4.8を使用してください:それで(r8eを使用している場合):

NDK_TOOLCHAIN_VERSION=4.7 

注意。それを使用します。

NDK_TOOLCHAIN_VERSION := clang3.6 

または

NDK_TOOLCHAIN_VERSION := clang 
+0

気まぐれな、 'clang3.6'は私のために3.8を使用しています(現在は5.1.1で最新のもの、'#ifdef'でチェックされています)。そして 'clang3.8'はエラーです。 –

2

NDK revision 8eには、Clang 3.2コンパイラがバンドルされています。それを使用して、あなたは良いです。

+0

このようにコンパイラを使用できますが、スレッド化を使用するには何か別の方法があります(私はAPP_STL:= gnustl_staticを使用しています)エラーが発生しました:名前空間 'std'に 'thread'という名前のメンバはありません。あなたは「fread」を意味しましたか? – Kimi

+0

@Kimi '$ NDK/docs/STABLE-APIS.html'にあるNDKのドキュメントには、次のように書かれています:' Android Cライブラリにはpthread()のサポートが含まれているので、 "LOCAL_LIBS:= -lpthread"これは、リアルタイム拡張(Linuxディストリビューションではllt)にも当てはまります。あなたは問題に直面している問題を貼り付けることができますか?問題を追跡するのが簡単になるでしょうか? – Samveen

1

まず、(android.mkと混同しないでください)あなたの "application.mk" を編集し、使用するツールチェーンを決めるとgcc 4.8のために挿入するには:

NDK_TOOLCHAIN_VERSION := 4.8 

またはあなたが打ち鳴らすしたい場合は:

NDK_TOOLCHAIN_VERSION := clang 

しかし、これはスレッドとは関係ありません。これは、使用するツールチェーンのみを定義します。ここでは、スレッド、およそ今

は、Android NDKのための簡単な例です:NDKについて

#include <pthread.h> // <--- IMPORTANT 

// This will be used to pass some data to the new thread, modify as required 
struct thread_data_arguments 
{ 
    int value_a 
    bool value_b; 
}; 

//--------------------------------- 

// This function will be executed in the new thread, do not forget to put * at the start of the function name declaration 
void *functionRunningInSeparateThread(void *arguments) 
{ 
    struct thread_data_arguments *some_thread_arguments = (struct thread_data_arguments*)arguments; 

    if (some_thread_arguments->value_b == true) 
    { 
     printf("VALUE= %i", some_thread_arguments->value_a); 
    } 

    // Signal the end of the thread execution 
    pthread_exit(0); 
} 

//--------------------------------- 

// This is the actual function creating and starting the new thread 
void startThread() 
{ 
    // Lets pass some data to the new thread, you can pass anything even large data, 
    // for that you only need to modify thread_data_arguments as required 
    struct thread_data_arguments *some_thread_arguments; 
    some_thread_arguments = (thread_data_arguments*)malloc(sizeof(*some_thread_arguments)); 

    some_thread_arguments->value_a = 12345; 
    some_thread_arguments->value_b = true; 

    // Create and start the new thread 
    pthread_create(&native_thread, NULL, functionRunningInSeparateThread, (void*)some_thread_arguments) 
} 
1

、ビルドをオープンApplication.mkと、以下の情報を追加。クラン3.6ツールチェーンを持っているあなたはNDKリビジョン9.

18

利用可能な最新のクランツールチェーンを使用して(私はNDKバージョンr9bに対処しています) (アプリケーションのすべてのソースコードのためのC++ 11のサポートを有効にするにはので、任意のモジュールが含まれています)Application.mkで次のように変更します。それ以外の場合は

# use this to select gcc instead of clang 
NDK_TOOLCHAIN_VERSION := 4.8 
# OR use this to select the latest clang version: 
NDK_TOOLCHAIN_VERSION := clang 


# then enable c++11 extentions in source code 
APP_CPPFLAGS += -std=c++11 
# or use APP_CPPFLAGS := -std=gnu++11 

を、あなただけのモジュールにC++ 11のサポートを持っているしたい場合は、あなたのAndroiにこの行を追加します。 Androidのgccのサポートは今に廃止されていること http://adec.altervista.org/blog/ndk_c11_support/

0

注:代わりに使用d.mkはもっとここに

LOCAL_CPPFLAGS += -std=c++11 

読み取りをAPP_CPPFLAGS。あなたは今clangを使用しているはずです。 version 11 release notesをお読みください。

NDK_TOOLCHAIN_VERSION=clang 

インストールされているNDKに基づいて最新バージョンを使用することができます。また---この記事の執筆時点---最新のNDK(v12)はAndroidスタジオを介してのみアクセスでき、ダウンロードページまたはスタンドアロンSDKマネージャを経由することはできません。

関連する問題