Android中C++原生代码创建临时文件的权限及路径问题咨询
Android下Boost Filesystem临时文件权限与目录获取方案
1. 能否通过adb shell给/data/local/tmp授予权限?
不行。/data/local/tmp是系统级临时目录,默认仅对root用户和特定系统进程开放写入权限。普通APP受Android沙箱机制限制,即便通过adb执行chmod修改目录权限,也会因为APP的UID不具备对应权限而无法正常写入,而且这种操作不具备通用性,无法作为面向用户的解决方案。
2. 替代的临时目录选择
推荐使用Android为每个APP分配的专属目录,这些目录默认开放读写权限,且符合系统安全规范:
- 应用私有缓存目录:路径为
/data/data/<你的APP包名>/cache,系统会在存储空间不足时自动清理该目录下的文件,适合存放临时文件。 - 外部存储缓存目录:路径为
/sdcard/Android/data/<你的APP包名>/cache,适合需要更大存储空间的场景。Android 10及以上无需申请额外权限,Android 9及以下需申请WRITE_EXTERNAL_STORAGE权限并在运行时请求。
3. 在NDK或Boost中获取应用数据目录
NDK原生代码中获取
最可靠的方式是通过JNI从Java层传递目录路径:
- Java层获取目录并调用Native方法传递:
// 示例:获取应用私有缓存目录 String cacheDir = getCacheDir().getAbsolutePath(); nativeSetTempDir(cacheDir);
- C++层接收并保存路径:
extern "C" JNIEXPORT void JNICALL Java_com_example_yourpackage_YourActivity_nativeSetTempDir(JNIEnv* env, jobject thiz, jstring dir_path) { const char* temp_path = env->GetStringUTFChars(dir_path, nullptr); // 将temp_path保存为全局变量或传递给Boost代码使用 env->ReleaseStringUTFChars(dir_path, temp_path); }
Boost中使用应用目录
Boost本身没有直接获取Android应用目录的API,需先通过上述JNI方式拿到合法的应用目录路径,再替换原代码中的fs::temp_directory_path():
namespace fs = boost::filesystem; // 假设已经通过JNI获取到app_cache_dir字符串 fs::path app_temp_dir(app_cache_dir); dest_path = app_temp_dir / fs::path("tmp-" + to_string(u) + "." + extension); fs::remove(dest_path); fs::copy_file(*doc.get_path(), dest_path);
内容的提问来源于stack exchange,提问作者Vivek Mangal
相关产品推荐
相关产品推荐

