NDK r9c - 不支持std :: future

时间:2014-05-24 00:06:32

标签: android android-ndk

我使用std :: future。

获得以下源代码
#include<future>
std::future<int> A;

但是,当我尝试在Application.mk文件中使用NDK_TOOLCHAIN_VERSION:= 4.8进行编译时,它会抛出错误“std :: future A”的类型不完整等。“

我尝试在android-ndk-r9c文件夹中查找future.h,但是,我找不到它。有谁知道NDK是否支持std :: future?如果是这样,哪个版本有此支持?

3 个答案:

答案 0 :(得分:6)

似乎std :: future不适用于ndk-r9c的任何stl库和编译器。

从ndk r9d开始,您可以使用llvm的libc ++库。该支持被描述为“实验性的”,但似乎效果很好。

而不是您当前选择的STL库(我猜是gnustl?),请在 Application.mk 中使用c++_sharedc++_static,如下所示:

APP_ABI := all APP_STL := c++_shared NDK_TOOLCHAIN_VERSION := clang

如果您遇到静态版本的某些运行时问题,您可以在Application.mk中添加LIBCXX_FORCE_REBUILD := true以强制重建它。

答案 1 :(得分:3)

@pree:我目前正在使用Application.mk中的相同设置进行试验:

APP_ABI := armeabi-v7a

APP_STL := gnustl_static

APP_CPPFLAGS := -frtti --std=c++11

NDK_TOOLCHAIN_VERSION := 4.8

然而,当我的代码在Nexus 10上运行正常时,该应用程序在我的LG手机上冻结。

编辑:我已经缩小了问题范围。我正在运行的代码如下:

auto task1 = std::packaged_task<void()>([]() {
    LOG_INFO("Task1 starting");
    sleep(5);
    LOG_INFO("Task1 finishing");
});
auto fut1 = task1.get_future();

auto task2 = std::packaged_task<void()>([]() {
    LOG_INFO("Task2 starting");
    sleep(10);
    LOG_INFO("Task2 finishing");
});
auto fut2 = task2.get_future();

std::thread([&](){task1();}).detach();
std::thread([&](){task2();}).detach();

LOG_INFO("waiting for task1");
fut1.wait();
LOG_INFO("waiting for task1 done");

LOG_INFO("waiting for task2");
fut2.wait();
LOG_INFO("waiting for task2 done");

在Nexus 10上,此代码生成以下输出:

 18:14:15.365: waiting for task1
 18:14:15.365: Task1 starting
 18:14:15.365: Task2 starting
 18:14:20.370: Task1 finishing
 18:14:20.370: waiting for task1 done
 18:14:20.370: waiting for task2
 18:14:25.365: Task2 finishing
 18:14:25.365: waiting for task2 done

在另一台设备(LG手机)上,我得到以下输出:

 18:23:21.999: Task1 starting
 18:23:21.999: waiting for task1
 18:23:26.999: Task1 finishing
 18:23:26.999: waiting for task1 done
 18:23:26.999: waiting for task2
 18:23:26.999: Task2 starting
 18:23:37.178: Task2 finishing
 18:23:37.178: waiting for task2 done

这意味着在LG设备上,第二个任务等待第一个任务完成,直到它开始。 但是,问题似乎来自std :: packed_task,而不是来自std :: future,因为以下代码在两个设备上都按预期运行:

std::promise<void> promise1;
auto task1 = std::function<void()>([&]() {
    LOG_INFO("Task1 starting");
    sleep(5);
    promise1.set_value();
    LOG_INFO("Task1 finishing");
});
auto fut1 = promise1.get_future();

std::promise<void> promise2;
auto task2 = std::function<void()>([&]() {
    LOG_INFO("Task2 starting");
    sleep(10);
    promise2.set_value();
    LOG_INFO("Task2 finishing");
});
auto fut2 = promise2.get_future();

std::thread([&](){task1();}).detach();
std::thread([&](){task2();}).detach();

LOG_INFO("waiting for task1");
fut1.wait();
LOG_INFO("waiting for task1 done");

LOG_INFO("waiting for task2");
fut2.wait();
LOG_INFO("waiting for task2 done");

我可能在这里做错了吗?

答案 2 :(得分:0)

正如我在上面的一条评论中提到的,我可以通过将armeabi-v7a指定为目标而不是armeabi来编译它。

NDK_TOOLCHAIN_VERSION := 4.8
APP_STL := gnustl_static
APP_ABI :=armeabi-v7a