2014-11-07 4 views
1

У меня установлена ​​последняя версия 64-разрядного NDK (r10c), а последняя версия Android Studio я могу скачать (0.8.14).Использование потоков и мьютексов в Android Studio с ndk 10c

Я делаю несколько вызовов JNI для использования String, Vector, Atomic и т. Д. Но я не могу понять, как использовать thread и mutex.

Оба они дают мне ту же ошибку

Error:(92, 5) error: 'thread' is not a member of 'std' 
Error:(93, 5) error: 'mutex' is not a member of 'std' 

я уверен, что NDK использует 4.9 ГНУ-libstdC++. Если я помещу в #error в файл, я вижу, что моя ошибка и компиляция прекращаются. Похоже, что я не пропускаю никаких определений, так как я могу помещать #error внутри класса и видеть его.

Вот НДК конфигурации в моем build.gradle

ndk { 
    moduleName "myLib" 
    ldLibs "log" 
    stl "gnustl_shared" 
    cFlags "-std=c++11 -frtti -fexceptions -pthread" 
} 

-frtti и -pthread, кажется, не имеет никакого значения. Я также пробовал stl gnustl_shared, а также gnustl_static, без разницы.

ответ

2

По умолчанию NDK по-прежнему использует GCC 4.6, который имеет искалеченную поддержку для C++ 11. Вам необходим эквивалент оценки для установки NDK_TOOLCHAIN_VERSION:=4.9 в Application.mk. Вы можете найти ответы на некоторые вопросы здесь: how to specify NDK_TOOLCHAIN_VERSION in gradle file for android ndk build, но, к сожалению, в нижней строке в том, что сегодня необходимо отключить автоматический НДК-строить вызов, установив jni.srcDirs опорожнить и использовать Android.mk и Application.mk файлы по старому.

Так, если в вашем JNI каталога, есть файлы file1.cpp и file2.cpp, вам понадобится следующее Android.mk

LOCAL_PATH   := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE   := myLib 
LOCAL_SRC_FILES  := file1.cpp file2.cpp 
LOCAL_LDLIBS   := -llog 
LOCAL_CFLAGS   := -std=c++11 -frtti -fexceptions -pthread 

... и Application.mk

APP_ABI    := armeabi-v7a 
APP_STL    := gnustl_shared 
NDK_TOOLCHAIN_VERSION := 4.9 
+0

вы уверены, что это 4,6 по умолчанию? Я уверен, что он использует 4.9, потому что, когда я редактирую файл потока в папке 4.9 NDK, я получаю ошибки сборки. В приведенной статье также указано, что в настоящее время 64bit использует 4.9 по умолчанию. –

+0

.. но вы не строите для 'APP_ABI = arm64-v8a', не так ли? –

+0

Нет, но разве это не говорит, что если я отредактирую поток, включите файл в 4.9, а #error показывает, что я определил, какой файл включен? Этот комментарий был мне непонятным, если они имели в виду 64-разрядную версию ndk или 64-битную сборку. –

Смежные вопросы