2014-03-31 41 views
0

我一直试图在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); 
} 

和JNI方法NDK库:

//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

NDK的不给你任何异常的安全模型。你将不得不使用你的su root shim(或者让你的设备“植根”的任何东西)启动一个助手应用程序(可能是'cat')作为root来为你读取数据。这已经在这里被覆盖了很多次,所以你应该期待你的问题可能会被重复关闭。 –

回答

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); 
相关问题