【问题标题】:Can't write to the file in android emulator无法在android模拟器中写入文件
【发布时间】:2011-09-16 02:16:07
【问题描述】:

问题描述

我正在为 Android 编写应用程序并使用本机代码,并在 Android-Emulator 上对其进行测试。为了查看 JNI 代码中发生了什么,我在 Android /data/LogTest/ 文件夹中创建了一个文件,并将我的日志信息写入其中。

FILE * pFile;
pFile = fopen ("/data/LogTest/Log.txt"", "w");
// .... 
// Write some logs to file ...
// ....

当我第一次运行 Android 应用程序时,一切正常,我可以在 Log.txt 文件中看到日志。但是当我关闭 Android 应用程序并再次运行它时,什么也没有发生。像应用程序不能第二次将日志写入文件。

自我想法

我认为这个问题的主要原因是,当我第一次创建文件时,创建者应用程序名称是 ex。 456 在我尝试将更多信息写入文件应用程序名称为 ex 之后。 856 等应用程序 856 无法写入已创建应用程序 456 的文件

问题

  1. 如何启动同名应用程序,以便 Android 让我第二次写入文件。
  2. 或者问题的主要原因不是应用程序每次都获得随机名称。

【问题讨论】:

  • 顺便说一句,你也可以通过 liblog 向 logcat 发送日志消息。
  • 您必须将 log.h 文件和 liblog 包含到您的 make 文件中,然后您才能在代码中使用 __android_log_write()。这是一篇详细介绍的博文。 blog.blackwhale.at/2009/08/android-ndk-logging
  • @ba__friend 感谢您的支持,您的回答对我非常有用,我从您的评论中学到了新东西,但这实际上不是我想要的,我需要写到 Log.txt跨度>
  • 检查fopen是否失败:if (pFile == NULL) perror("fopen");

标签: java android c android-emulator java-native-interface


【解决方案1】:

我认为您不允许在该文件夹中写入内容。阅读这里的答案。使用 sdk 卡或您的应用程序目录来存储文件。

File Operations in Android NDK

【讨论】:

  • 我喜欢这个链接。 Android NDK 中的文件操作
【解决方案2】:

您的代码在我的模拟器上生成错误。然而你说

当我第一次在 Android 中运行时 应用程序一切顺利,我 可以在 Log.txt 文件中看到日志

也许您可以将更多代码发送给我们,以便我们重现错误。
这是我试图重现您的问题

#include<stdio.h>
#include<jni.h>
#include<android/log.h>//allow android logging
#include<errno.h>//for errors
#include<string.h>

#define  LOG_TAG    "DEO MSG"//all my logs are labeled with this
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)

void Java_com_deo_MyActivity_writeLogFileUsingC(JNIEnv * env, jobject thisObject)
{   char filename[]="/data/LogTest/Log.txt";
    LOGE("native method started");//is used exactly like the usual printf()
    FILE * pFile;
    LOGE("trying to open file for writing");
    pFile= fopen(filename, "w");
    if(pFile==NULL)
    {
        LOGE("Failed to open the file %s in mode 'w'.(DETAILS)%s ",filename,strerror(errno));
    }
    else
    {
        LOGE("trying to write to file");
        fprintf(pFile,"logExample  "); //example of a log.
        fclose(pFile);//safely close our file
        LOGE("file writing done");
    }
}

它在logcat中产生的错误是

ERROR/DEO MSG(816): Failed to open the file /data/LogTest/Log.txt in mode 'w'.(DETAILS)No such file or directory

我认为我对您的代码的问题可能是权限。为我们详细描述一下。
PS:

  • 与日志文件相比,我个人更喜欢使用 logcat 进行调试

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2015-11-10
    • 2013-03-23
    • 1970-01-01
    相关资源
    最近更新 更多