Использование потока и мьютекса в Android Studio с ndk 10c

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

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

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

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 gnu-libstdc++. Если я добавлю #error в файл, я увижу свою ошибку, и компиляция остановится. Похоже, я не пропускаю ни одного определения, так как могу поместить #error внутри класса и увидеть его.

Вот конфигурация ndk в моем build.gradle

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

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


person GR Envoy    schedule 07.11.2014    source источник


Ответы (1)


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

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

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
person Alex Cohn    schedule 07.11.2014
comment
Вы уверены, что по умолчанию стоит 4.6? Я почти уверен, что он использует 4.9, потому что, когда я редактирую файл потока в папке 4.9 NDK, я получаю ошибки сборки. В статье, которую вы цитировали, также говорится внизу, что 64-битная версия теперь использует 4.9 по умолчанию. - person GR Envoy; 09.11.2014
comment
.. но вы же не для APP_ABI=arm64-v8a строите? - person Alex Cohn; 09.11.2014
comment
Нет, но разве это не говорит о том, что если я редактирую включаемый файл потока в 4.9, а #error показывает, что я определил, какой файл включается? Этот комментарий был неясен для меня, имели ли они в виду 64-битную версию ndk или 64-битную сборку. - person GR Envoy; 09.11.2014
comment
Это очень легко проверить. Запустите ndk-build из командной строки, и вы увидите разницу или нет. - person Alex Cohn; 09.11.2014
comment
Я не уверен, что следую. Что вы хотите, чтобы я сделал со сборкой ndk из командной строки? - person GR Envoy; 10.11.2014
comment
Если вы считаете, что ваша сборка не работает, даже если компилятор gcc 4.9 запущен, вы можете доказать это, запустив этот компилятор (и 4.6 для сравнения) с помощью ndk-build из командной строки. Или используйте одно из решений, которое позволяет запускать ndk-build как шаг вашей сборки Gradle. - person Alex Cohn; 10.11.2014
comment
Есть ли у вас какие-либо советы о том, как выполнить сборку из командной строки? Или я должен использовать исходную ссылку, которую вы прислали? Я отредактировал версию потока 4.6 и теперь вижу там ошибку, так что похоже, что он пытается скомпилировать оба? - person GR Envoy; 10.11.2014
comment
Вам не нужна никакая ссылка, просто поместите файлы Android.mk и Application.mk в каталог jni и запустите ndk-build из командной строки. - person Alex Cohn; 10.11.2014
comment
Что мне нужно иметь в файлах Android.mk и Application.mk? Я не делал jni в Eclipse, поэтому я изучаю и это, и Gradle. Я могу запустить ndk-build '-C' filePath('{Полный путь к каталогу src?}') - person GR Envoy; 10.11.2014
comment
ndk-build -C "full path to src dir" точно. Проверьте наличие full_path_to_src_dir/jni/Android.mk и full_path_to_src_dir/jni/Application.mk. Вам не нужно filePath(). - person Alex Cohn; 10.11.2014
comment
Но как мне создать два файла mk? - person GR Envoy; 10.11.2014