如何为__android_log_print设置输入和格式的变量号

时间:2019-07-12 13:02:23

标签: c++ printf

例如,我有一个点向量,只能在运行时确定其大小。

vector<Point2f> image_points;

....

__android_log_print(ANDROID_LOG_DEBUG, "JNI","Image Points are: (%.2f,%.2f)(%.2f,%.2f)(%.2f,%.2f)(%.2f,%.2f)",
                        image_points[0].x,image_points[0].y,image_points[1].x, image_points[1].y,image_points[2].x,image_points[2].y,image_points[3].x, image_points[3].y);

此代码我仅假设有4个点,但是可能有0到许多点 我认为它在某种程度上类似于printf和vprintf,但是我都不了解该部分。我该如何编写va_list和formate部分?请在您的答案中张贴确切的可行代码。

2 个答案:

答案 0 :(得分:0)

虽然您可以构造一个动态格式的字符串并编成va_list进行匹配,但您最好跳过它并在本地生成最终输出,然后将字符串发送给Android记录器

为方便起见,使用std::string作为缓冲区:

std::string buf;
buf.reserve(image_points.size() * 32);
char tmp[32];
for (const auto & point: image_points) {
  sprintf(tmp, "(%.2f, %.2f)", point.x, point.y);
  buf.append(tmp);
}
__android_log_print(ANDROID_LOG_DEBUG, "JNI","Image Points are: %s", buf.c_str());

答案 1 :(得分:0)

这是我总结的答案,因此我自定义了to_string函数以将vector 转换为std :: string

vector<Point2f> image_points;
template<typename T>
String to_string(vector<Point_<T>> input){
    if (std::is_same<T, float>::value) {
        std::string buf;
        buf.reserve(input.size() * 32);
        char tmp[32];
        for (const auto &point: input) {
            sprintf(tmp, "(%.2f, %.2f)", point.x, point.y);
            buf.append(tmp);
        }
        return buf;
    }

....//some code in between

 __android_log_print(ANDROID_LOG_DEBUG, "JNI","Image Points are: 
 %s",to_string(image_points).c_str());

任何人都有任何其他建议来编写更简单的功能,请随时发表评论