android - 在带有 ndk 10c 的 Android Studio 中使用线程和互斥锁

标签 android android-ndk android-studio gnu build.gradle

我有最新版本的 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 放在类中并查看它。

这是我的 build.gradle 中的 ndk 配置

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

-frtti 和-pthread 似乎没有区别。我也尝试过 gnuSTL_shared 和 gnuSTL_static 的 STL,没有区别。

最佳答案

默认情况下,NDK 仍然使用 GCC 4.6,它削弱了对 C++11 的支持。在 Application.mk 中设置 NDK_TOOLCHAIN_VERSION:=4.9 需要同等等级。您可以在这里找到一些答案: how to specify NDK_TOOLCHAIN_VERSION in gradle file for android ndk build ,但不幸的是,今天您必须通过将 jni.srcDirs 设置为空并使用 Android 来禁用自动 ndk-build 调用.mkApplication.mk 文件以旧方式。

因此,如果在您的jni 目录中,有文件file1.cppfile2.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

关于android - 在带有 ndk 10c 的 Android Studio 中使用线程和互斥锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26808073/

相关文章:

android - 生成 Android.mk 的工具

android - 为 OpenH264 android 构建 .so 文件

android - WebView.draw(canvas) 有时会在某些设备上的 Android Lollipop 5.0+ 中崩溃 - 致命信号 11 (SIGSEGV)

android - settings.gradle 中的环境变量不适用于 Android Studio

android - 在 AAR 中请求 Marshmallow 的许可

java - Android 中的进度对话框不显示?

android - Admob 不使用 AsyncTask

android - 在 OSX 上为 Android Rom 创建缓存时出错

android - 每个构建变体的不同应用程序类在某些设备上崩溃

android - Gradle同步问题错误:任务 ':app:mergeDebugResources'的执行失败