
2.1 第一个NDK项目
接下来我们创建第一个NDK项目来完成案例的演示。
2.1.1 使用Android Studio创建NDK项目
首先打开Android Studio,在菜单栏中依次选择File→New→New Project...来打开新建项目向导,选择相应的项目模板创建NDK项目,如图2-1所示。
之后配置项目属性,如图2-2所示,单击Next按钮进入下一步。
在Activity界面选择默认配置即可,直接单击Finish按钮,如图2-3所示。
接下来耐心等待Gradle配置完成,界面如图2-4所示。

图2-1 Android Studio新建项目选择模板

图2-2 Android Studio配置项目属性

图2-3 Android Studio配置Activity界面

图2-4 Android Studio NDK项目界面
2.1.2 编写自己的so业务代码
首先打开activity_main.xml,添加一个Button控件,如图2-5所示。
编写MainActivity.java代码,添加md5()方法并编写Button按钮的单击事件来调用该方法,如图2-6所示。

图2-5 打开activity_main.xml,添加Button控件

图2-6 MainActivity.java代码
可以发现md5()方法名报红,这是因为编译器没有找到方法相应的实现。单击报红的函数名,然后使用组合键<Alt+Enter>选择Create JNI function for md5,如图2-7所示。
Android Studio会自动在native-lib.cpp中生成一个md5()方法的空实现,如图2-8所示。

图2-7 自动创建JNI函数

图2-8 自动生成的md5()方法空实现
在GitHub上找一份md5()方法的相应实现,代码链接为https://github.com/pod32g/MD5,将代码粘贴到上述的空实现处,如图2-9所示。
连接模拟器或者真机并运行,APK会自动编译并安装到目标计算机上。单击MD5按钮,TextView的内容会改变,如图2-10所示。
经过CyberChef的验证,程序的计算结果是正确的。
接下来我们开始通过unidbg来模拟执行自己编写的so文件中的md5()方法。

图2-9 native-lib.cpp代码

图2-10 自编写App运行界面