如何使用NDK读取根设备上系统目录中的文件?

时间:2014-03-31 16:54:22

标签: android android-ndk

我一直在尝试读取NDK库中的系统文件,例如:

/data/misc/wifi/wpa_supplicant.conf

这是我尝试过的代码:

//MainActivity.java:
private native String getNetworkList();

if(RootTools.isAccessGiven()) {
    String jsonList = getNetworkList();
    Log.d("TAG", "jsonList=" + jsonList);
}
ndk库中的

和jni方法:

//getNetworkList()
string name = "/data/misc/wifi/wpa_supplicant.conf"
string command = "su -c \"chmod 0777 ";
command += name;
command += "\"";
LogE("command=%s\n", command.c_str());

int exitCode = system(command.c_str());
LogE("exitCode=%d\n", exitCode);

//chmod success, exitCode=0

FILE *pFile = fopen(name, "r");
if (!pFile)
{
    LogE("fopen() failed: %s\n", strerror(errno));
    return false;
}

fopen()获得权限被拒绝错误。

我该怎么办? 谢谢

1 个答案:

答案 0 :(得分:1)

经过一番研究,结果发现“su”正在一个新进程中运行,因此在原始进程中运行的fopen()仍然没有root权限。

所以我使用以下代码,它工作正常:

FILE *pCmd = NULL;
char strCmd[1024] = "su -c \"cat ";
strcat(strCmd, file_name);
strcat(strCmd, "\"");

//use popen to read shell output
pCmd = popen(strCmd, "r");
if(!pCmd)
{
    LogE("popen() failed: %s\n", strerror(errno));
    return false;
}

//here you can read pCmd using fread, fgets, fgetc:
char token = fgetc(pCmd);

//when finish reading
pclose(pCmd);