You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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层传递目录路径:

  1. Java层获取目录并调用Native方法传递:
// 示例:获取应用私有缓存目录
String cacheDir = getCacheDir().getAbsolutePath();
nativeSetTempDir(cacheDir);
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 03:52:48