我一直在尝试读取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()获得权限被拒绝错误。
我该怎么办? 谢谢
答案 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);