__android_log_print(ANDROID_LOG_INFO,"jni",jstring2str(env, elogJniLogPath).data());
__android_log_print(ANDROID_LOG_INFO,"jni","elog_init_start");
/home/user/work/project/jni.cpp:10:9: error: format string is not a string literal (potentially insecure) [-Werror,-Wformat-security]
__android_log_print(ANDROID_LOG_INFO,"jni",jstring2str(env, elogJniLogPath).data());
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/user/work/jni.cpp:10:9: note: treat the string as an argument to avoid this
__android_log_print(ANDROID_LOG_INFO,"jni",jstring2str(env, elogJniLogPath).data());
^
"%s",
这里为什么会报错?string.data()跟string.c_str()都试过了,都会报这个错
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
这个错误一般是由于格式化字符串中包含变量或表达式而不是字符串字面量所导致的。为了解决这个问题,您可以将格式化字符串作为单独的参数传递给__android_log_print
函数,而不是使用字符串字面量。例如,您可以将代码更改为以下形式:
__android_log_print(ANDROID_LOG_INFO, "jni", "%s", jstring2str(env, elogJniLogPath).c_str());
在这个版本中,我们将格式化字符串"jni"
移到第二个参数中,而将要打印的字符串作为第三个参数传递,并使用c_str()
函数获得字符串的C风格表示。这样做的原因是__android_log_print
函数需要一个字符串字面量作为其第三个参数,而c_str()
函数返回一个指向C风格字符串的指针,该字符串可以被视为字符串字面量。
另外,如果您使用的是C++11或更高版本的C++,那么您可以使用字符串字面量连接运算符+
来将格式化字符串与变量或表达式连接起来,而不是使用printf
风格的格式化字符串。例如,您可以将代码更改为以下形式:
__android_log_print(ANDROID_LOG_INFO, "jni", "Log path: %s", jstring2str(env, elogJniLogPath).c_str());
在这个版本中,我们使用字符串字面量连接运算符将格式化字符串"Log path: "
与要打印的字符串连接起来,并将连接的结果作为第三个参数传递给__android_log_print
函数。这种方法更加简洁,并且避免了使用printf
风格的格式化字符串所带来的一些问题。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢