第一次编辑,排版很稀烂,不过附件有源代码和讲解文档,可以下载浏览。自从google引入了JNI技术,不论是android正向开发还是逆向,对于本地层更加的关注,因为越来越多的重要代码都会放到本地层,这次就简单的介绍一下一个入门的NDK开发。
首先对于NDK的下载以及环境变量配置网上都有,也很简单,自己百度一下就ok了。
下面进入正题:
步骤:
1. 新建一个Android工程:
2. 新建一个.java文件调用本地代码以及方法定义
这块注意:明显可以看出来是调用叫做“soJni”的本地代码,其中这个本地方法里面有一个重要的方法名字叫做soHello(),前面有一个关键字native,这在静态分析中很关键,一般核心代码或核心的逻辑都会写在这个里面。
3. 创建JNI本地函数原型,以供Java虚拟机识别
其实这一步就是生成一个.c的头文件供具体的本地函数编写时进行引入
在dos下面进入到工程的根目录下面:
这里就要用到javah来进行生成头文件,命令是:
javah–classpath bin/classes –d jni com.example.jnitest.CallSo
可以看到我们这个成功了没问题,生成了头文件,可以看一下头文件里面是具体的怎么写的?
可以看到就是对之前那个.java文件里面重要方法的一些声明,声明成能够用JNI过度的形式,在这里读着可能对这个命令有点好奇:
javah–classpath bin/classes –d jni com.example.jnitest.CallSo
在这里做一个简单的介绍:–classpath bin/classes,因为在eclipse中我们编写代码时它会自动的编译成.class形式,
这里生成头文件就是依据这些.class; –d jnicom.example.jnitest.CallSo,意思是生成的头文件放到当前目录的jni目录下面,ok,了解到这就可以了。。我们继续
4. 编写本地代码
最为重要的一步就是编写本地代码,可以参考上面的.h头文件
在jni下面新建一个.c文件(注意名字必须与前面的对应)
这一步参照上一步形成的.h头文件:具体的代码形式为:
至于为什么是这种格式?这是JNI自定义的一种代码编写格式,一般在定义具体的数据类型时,会在签名加上j,比如上面的jstring,具体的资料网上有很多,可以查阅来看
5. 编写Android.mk文件
Android.mk文件是工程的编译脚本,描写了编译原生程序所需的编译选项,头文件,源文件以及依赖库,这个基本上是固定的。
生成so文件:
直接进去工程根目录:
ndk-build
生成共享库SO文件。
6. 补充完android调用代码
7. 运行结果为:
这里有点问题就是上面输出时:不能显示汉字,就是上面第四步。所以改成英文的,可能跟这个编码有关吧!
Ok,今天就到这里,这个编辑器用的好累,over!
工程项目下载以及文档讲解为:
http://download.csdn.net/detail/feibabeibei_beibei/9509222