【问题标题】:Using thread and mutex in Android Studio with ndk 10c在带有 ndk 10c 的 Android Studio 中使用线程和互斥锁
【发布时间】:2015-01-04 15:33:00
【问题描述】:

我有最新版本的 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的stl和gnustl_static,没区别。

【问题讨论】:

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


    【解决方案1】:

    默认情况下,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 设置为空来禁用自动 ndk-build 调用以旧方式使用 Android.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
    

    【讨论】:

    • 你确定默认是4.6吗?我很确定它使用的是 4.9,因为当我在 NDK 的 4.9 文件夹中编辑线程文件时,会出现构建错误。你引用的那篇文章,还在底部说现在64位默认使用4.9。
    • .. 但你不是为 APP_ABI=arm64-v8a 构建的,是吗?
    • 不,但如果我在 4.9 中编辑线程包含文件并且#error 表明我已确定包含哪个文件,这难道不是说明吗?我不清楚该评论是指 ndk 的 64 位版本还是 64 位版本。
    • 检查起来超级容易。从命令行运行ndk-build,你会看到区别,或者你不会。
    • 我不确定我是否遵循。你想让我用命令行的 ndk 构建做什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    相关资源
    最近更新 更多