我使用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?如果是这样,哪个版本有此支持?
答案 0 :(得分:6)
似乎std :: future不适用于ndk-r9c的任何stl库和编译器。
从ndk r9d开始,您可以使用llvm的libc ++库。该支持被描述为“实验性的”,但似乎效果很好。
而不是您当前选择的STL库(我猜是gnustl?),请在 Application.mk 中使用c++_shared
或c++_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