我正在使用 Android NDK r9d 和 Toolchain 4.8,但我无法使用 std::to_string 函数,编译器会报错:
error: 'to_string' is not a member of 'std'
这个函数在Android NDK上不受支持吗?我尝试使用APP_CPPFLAGS := -std=c++11
,但是没有成功。
我正在使用 Android NDK r9d 和 Toolchain 4.8,但我无法使用 std::to_string 函数,编译器会报错:
error: 'to_string' is not a member of 'std'
这个函数在Android NDK上不受支持吗?我尝试使用APP_CPPFLAGS := -std=c++11
,但是没有成功。
LOCAL_CFLAGS := -std=c++11
,但请注意,NDK的gnustl不支持所有的C++11 API。带有完整C++14支持的选项是libc++ (APP_STL := c++_shared
)。
另一种选择是自己实现。
#include <string>
#include <sstream>
template <typename T>
std::string to_string(T value)
{
std::ostringstream os ;
os << value ;
return os.str() ;
}
int main()
{
std::string perfect = to_string(5) ;
}
使用 NDK r9+,您可以使用llvm-libc++,它完全支持 cpp11。
在您的Application.mk中,您需要添加:
APP_STL:=c++_static
或者APP_STL:=c++_shared
:)
。 - albciff如果您正在寻找 Gradle 构建系统的解决方案,请查看这个答案。
添加字符串:
arguments "-DANDROID_STL=c++_shared"
在你的 build.gradle
文件中。例如:
android {
...
defaultConfig {
...
externalNativeBuild {
cmake {
...
arguments "-DANDROID_STL=c++_shared"
}
}
}
...
}
如果您正在寻找实验性 Gradle 插件的解决方案,这个方法对我有效...
已测试通过 com.android.tools.build:gradle-experimental:0.9.1
model {
...
android {
...
ndk {
...
stl = "c++_shared"
}
}
}
我无法使用c++_static
,它会出现一些未定义异常的错误。所以我回到了gnustl_static
。
但是在NDK源代码中,在sources/cxx-stl/llvm-libc++/src/string.cpp
中,我找到了to_string(int)
的实现,并尝试将其复制到我的代码中。经过一些更正后,它可以工作了。
所以我最终得到的代码片段是:
#include <string>
#include <algorithm>
using namespace std;
template<typename S, typename P, typename V >
inline
S
as_string(P sprintf_like, S s, const typename S::value_type* fmt, V a)
{
typedef typename S::size_type size_type;
size_type available = s.size();
while (true)
{
int status = sprintf_like(&s[0], available + 1, fmt, a);
if ( status >= 0 )
{
size_type used = static_cast<size_type>(status);
if ( used <= available )
{
s.resize( used );
break;
}
available = used; // Assume this is advice of how much space we need.
}
else
available = available * 2 + 1;
s.resize(available);
}
return s;
}
template <class S, class V, bool = is_floating_point<V>::value>
struct initial_string;
template <class V, bool b>
struct initial_string<string, V, b>
{
string
operator()() const
{
string s;
s.resize(s.capacity());
return s;
}
};
template <class V>
struct initial_string<wstring, V, false>
{
wstring
operator()() const
{
const size_t n = (numeric_limits<unsigned long long>::digits / 3)
+ ((numeric_limits<unsigned long long>::digits % 3) != 0)
+ 1;
wstring s(n, wchar_t());
s.resize(s.capacity());
return s;
}
};
template <class V>
struct initial_string<wstring, V, true>
{
wstring
operator()() const
{
wstring s(20, wchar_t());
s.resize(s.capacity());
return s;
}
};
string to_string(int val)
{
return as_string(snprintf, initial_string<string, int>()(), "%d", val);
}
对于 Android Studio,在 build.gradle(移动应用程序)中添加以下内容:
externalNativeBuild {
cmake {
cppFlags "-std=c++11"
arguments "-DANDROID_STL=c++_static"
}
}
std::ostringstream
上出现了错误。问题可能与Android Studio 2.2 alpha 6有关。有没有简单的方法可以转换? - Onur Tunalibloglib-jni.so 0xdd7bdacf std::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_ostringstream() (basic_ios.h:276) 36 libart.so 0xf4832812 (缺失) 37 libloglib-jni.so 0xdd7a5851 std::string patch::to_string<int>(int const&)
如果您有任何解决方案,请提供。 - Om Infowave Developers