Android 的 Native 层保存数据到external目录

在 Android 的 Native 层(例如使用 C/C++ 开发)中,要创建文件并保存数据到应用的 external 目录,你需要以下步骤:

1. 获取应用的 External 目录路径

  • 使用 JNIEnv 的 GetExternalStorageDirectory 方法来获取外部存储的根目录。
  • 使用 strcat 或 snprintf 将应用包名追加到根目录路径,从而得到应用的 external 目录路径。

示例代码:

#include <jni.h>
#include <string.h>
#include <android/log.h>

extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_myapp_MainActivity_getExternalStorageDir(JNIEnv *env, jobject thiz) {
  // 获取外部存储根目录
  jstring externalStoragePath = (jstring) env->CallStaticObjectMethod(env, env->FindClass("android/os/Environment"), env->GetStaticMethodID(env, env->FindClass("android/os/Environment"), "getExternalStorageDirectory", "()Ljava/io/File;"));

  // 获取应用包名
  jclass activityClass = env->GetObjectClass(thiz);
  jmethodID getPackageName = env->GetMethodID(activityClass, "getPackageName", "()Ljava/lang/String;");
  jstring packageName = (jstring) env->CallObjectMethod(thiz, getPackageName);

  // 将包名追加到外部存储根目录路径
  const char *externalStorageDir = env->GetStringUTFChars(externalStoragePath, 0);
  const char *package = env->GetStringUTFChars(packageName, 0);
  char *appExternalDir = new char[strlen(externalStorageDir) + strlen(package) + 2];  // +2 for '/' and '\0'
  strcpy(appExternalDir, externalStorageDir);
  strcat(appExternalDir, "/");
  strcat(appExternalDir, package);

  env->ReleaseStringUTFChars(externalStoragePath, externalStorageDir);
  env->ReleaseStringUTFChars(packageName, package);

  // 将路径转换为 jstring 返回给 Java 层
  jstring result = env->NewStringUTF(appExternalDir);
  delete[] appExternalDir;
  return result;
}

2. 创建文件并写入数据

  • 使用 fopen 打开文件,并使用 fwrite 写入数据。
  • 最后使用 fclose 关闭文件。

示例代码:

#include <stdio.h>

// ... (其他代码)

// 在外部存储目录中创建文件并写入数据
FILE *file = fopen("/path/to/your/file.txt", "w"); 
if (file != NULL) {
  fprintf(file, "This is some data to write\n");
  fclose(file);
  __android_log_write(ANDROID_LOG_INFO, "MyApp", "Data saved to file"); 
} else {
  __android_log_write(ANDROID_LOG_ERROR, "MyApp", "Failed to open file");
}

注意事项:

  • 确保应用有外部存储的写入权限。
  • 在使用 fopen 打开文件时,使用正确的路径。
  • 使用 __android_log_write 来输出调试信息。
  • 记得释放 JNIEnv 的资源。
  • 在创建文件时,你需要考虑文件路径的安全性,防止文件被其他应用访问。

完整示例:

#include <jni.h>
#include <string.h>
#include <android/log.h>
#include <stdio.h>

extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_myapp_MainActivity_getExternalStorageDir(JNIEnv *env, jobject thiz) {
  // ... (获取外部存储目录路径的代码)
}

extern "C"
JNIEXPORT void JNICALL
Java_com_example_myapp_MainActivity_saveToFile(JNIEnv *env, jobject thiz) {
  // 获取外部存储目录路径
  jstring externalStoragePath = Java_com_example_myapp_MainActivity_getExternalStorageDir(env, thiz);
  const char *path = env->GetStringUTFChars(externalStoragePath, 0);

  // 拼接文件路径
  char filePath[256];
  sprintf(filePath, "%s/my_data.txt", path);

  // 创建文件并写入数据
  FILE *file = fopen(filePath, "w");
  if (file != NULL) {
    fprintf(file, "Hello from Native!\n");
    fclose(file);
    __android_log_write(ANDROID_LOG_INFO, "MyApp", "Data saved to file");
  } else {
    __android_log_write(ANDROID_LOG_ERROR, "MyApp", "Failed to open file");
  }

  env->ReleaseStringUTFChars(externalStoragePath, path);
}

在 Java 层调用 Native 函数:

public class MainActivity extends AppCompatActivity {

  static {
    System.loadLibrary("myNativeLibrary"); // 你的 Native 库名称
  }

  public native String getExternalStorageDir();
  public native void saveToFile();

  // ... (其他代码)

  public void saveData() {
    saveToFile();
  }
}

注意:

  • 你需要使用 ndk-build 或其他工具将你的 C/C++ 代码编译成动态库(.so 文件),并在你的 Android 项目中添加该库。
  • 你可能需要在你的 AndroidManifest.xml 文件中添加 WRITE_EXTERNAL_STORAGE 权限,以允许你的应用写入外部存储。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值