先声明一下这是参考eoe的视频教程做到的实验。
实验环境:
Windows平台+eclipse+虚拟机跑4.1安卓
实验目标:
1. 改造ndk例子程序helloJni,在调用c代码的地方加一行
system("huexec");
既可实现系统调用。
2. 编写huexec的代码,代码的内容是在/data/目录下创建一个hu_test文件。
3. 把huexec以root权限提升为4777权限,然后把这个文件预先copy到/system/bin目录下,以便普通的app能访问到。
4. 验证结果。
关键代码:
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
{
system("huexec");
return (*env)->NewStringUTF(env, "Hello dear from my JNI !");
}
huexec.c的代码
#include <stdio.h>
int main(int argc, char* argv[])
{
fclose(fopen("//data//hu_test","w"));
return 0;
}
验证结果,在/data/目录下找到生成的hu_test,实验成功。
遇到几个问题:
1. 不能往虚拟机的sdcard写入。
原因:放虚拟机文件的目录没有去掉只读标记,我的目录是E:\.android\avd,进入这个目录右键,把只读去掉即可。
2. 不能往system目录写入。
原因:估计默认开机是以只读方式mount的,在终端里面执行:
adb remount之后再去访问就可以了。
用adb shell进入虚拟机之后,直接就是#提示符,也就是root权限。比用手机还方便,我的手机没有root,做不了这个实验。
3. 用系统命令生成的新文件找不到地方,也不知道是否真的成功,用强制指定决定路径解决。