《教我..》系列编写so -- 使用AndroidStudio 3.X编写so
> 最近在跟随 [会飞的小丑鸭](https://www.52pojie.cn/home.php?mod=space&uid=619334) 的《教我兄弟学逆向..》系列贴学习逆向,在[《教我兄弟学Android逆向06 用AndroidStudio编写第一个so》](https://www.52pojie.cn/thread-706568-1-1.html) 一帖中,按照帖子所教内容成功编译出so文件,但在 "课后作业" 时,编译时缺出现了一系列问题,导致最后没有成功,查看下面大家的一些评论,看到了一些为了跟随学习,又选择了低版本的AS,也看到了一些评论说gradle3.0以上放弃了帖中的生成方法,于是,我开始了解决AS3.X 以上版本编写so的问题,最后终于成功,现将中间解决时出现的问题写出来希望能够帮助大家> 此帖是在 《教我兄弟学Android逆向06 用AndroidStudio编写第一个so》基础上编写,一些简单配置地方可能会省略,尽可能的做到详细说明
#### NDK
* 下载好NDK,并配置好环境变量,AndroidStudio中并也配置好。(此处无需使用教学帖中 NDK-r10版本,使用这个r10低版本会有问题,并提示需要"rxx"版本以上,此处本人以最新的r20版本为例进行编写)
!(http://m.qpic.cn/psb?/V14YlNrL2eQEkW/VywGdm01OqnXeOeF2ZY6BkyiltSyRRD0uJWqPRm9yNA!/b/dMMAAAAAAAAA&bo=hwOhAgAAAAADBwU!&rf=viewer_4)
#### AndroidStudio编写so
* 编写JNI接口类
!(http://m.qpic.cn/psb?/V14YlNrL2eQEkW/jBEjXZQpKjp57RhAmsW93I6yO34RdL0c6UxFVwE04Ow!/b/dFMBAAAAAAAA&bo=AAQ2AgAAAAADBxI!&rf=viewer_4)
* 找到JNI接口类文件路径,在此处调用cmd窗口(个人习惯,亦可在AS的命令行窗口进行,不过需要在当前类的路径下)生成 .class文件
!(http://m.qpic.cn/psb?/V14YlNrL2eQEkW/2731ps.laVIsroitVqpHFFnt1UyTYhUnDSr13tXMM7Q!/b/dL8AAAAAAAAA&bo=PwLVAgAAAAADF9g!&rf=viewer_4)
![生成class文件](http://m.qpic.cn/psb?/V14YlNrL2eQEkW/AJxC1fnqyGmpoyhApBkb6UbkaHLCSDHqDHbxTGABxQs!/b/dL8AAAAAAAAA&bo=ewM*AQAAAAADB2Q!&rf=viewer_4)
* 返回到"java"目录下,调用cmd窗口,使用命令 "javah -jni 包名.类名" 生成.h文件。注意一定要在java层目录下输入命令,不然不会报错:找不到xxx类
![生成.h文件](http://m.qpic.cn/psb?/V14YlNrL2eQEkW/IcYCieG3CpF5ZZfoSJ2CcBm129soDs2sHeS3qeIunSw!/b/dIMAAAAAAAAA&bo=0wMAAgAAAAADB*A!&rf=viewer_4)
* 创建 jni 文件夹,并将.h文件移动到此文件夹下。然后创建一个空的c文件,并对其编写。编写内容:将.h文件中 两个方法相关的代码复制到c文件中,头部引用.h文件
![生成jni文件夹](http://m.qpic.cn/psb?/V14YlNrL2eQEkW/0wpPCdRkZn0qBrwnkNPjs70S6nBNVGpLT6bwIOg5RHo!/b/dFIBAAAAAAAA&bo=IwSZAwAAAAADF48!&rf=viewer_4)
![编写c文件](http://m.qpic.cn/psb?/V14YlNrL2eQEkW/*5ObY9.oFQmCEkc1Vj9tVOUn8kTY*hWYMYXlTxe5Vis!/b/dL8AAAAAAAAA&bo=ogUoAgAAAAADF78!&rf=viewer_4)
* 下载CMake和LLDB。(需要注意:CMake 不可下载 3.10.版本 需要下载3.6.版本,不然会报错,具体 查看/下载 ‘点击AS-SDKManager - 右下角 showPackageDetails -查看CMake’)
![下载CMake和LLDB](http://m.qpic.cn/psb?/V14YlNrL2eQEkW/pPZBgow9BJNlED73fJKf6Yeg6VBc1ciBvaMxgwGvEAo!/b/dL8AAAAAAAAA&bo=AQSuAgAAAAADB4s!&rf=viewer_4)
* 下载好后 在项目的build.gradle下进行相关配置
![配置build.gradle](http://m.qpic.cn/psb?/V14YlNrL2eQEkW/In.gzJKr8K*wENN.LqgXCS8RgozW*JXvY9zOlfI0kHw!/b/dMMAAAAAAAAA&bo=egVGAgAAAAADFwk!&rf=viewer_4)
```
// 使用Cmake工具
externalNativeBuild {
cmake {
cppFlags ""
//生成多个版本的so文件
abiFilters 'arm64-v8a','armeabi-v7a','x86','x86_64'
}
}
// 配置CMakeLists.txt路径
externalNativeBuild {
cmake {
path "CMakeLists.txt" // 设置所要编写的c源码位置,以及编译后so文件的名字
}
}
```
* 关于 CMakeLists.txt 如何得来的,可以自己在新建项目的时候 勾选“Include c/c++” 生成的项目就有此文件。
* 修改 CMakeLists.txt 内容
![编写CMake](http://m.qpic.cn/psb?/V14YlNrL2eQEkW/t*fqG1uTuLDEUPZO*62VSHorz1FKHU6CRU7fIi8XolA!/b/dL4AAAAAAAAA&bo=jQQbAwAAAAADB7M!&rf=viewer_4)
* 编译 点击"Build - Rebuild Project",编译后在 "app - build - intermediates - cmake - debug - obj "下查看so库
![编译-查看so库](http://m.qpic.cn/psb?/V14YlNrL2eQEkW/WWGHrGJfqtU1Zjl3L*wsYo.S7wjoeXI.x9kn5A0QAn4!/b/dLgAAAAAAAAA&bo=xwHGAgAAAAADByA!&rf=viewer_4)
* 项目创建jniLibs并调用so库方法
![创建文件夹并调用so库方法](http://m.qpic.cn/psb?/V14YlNrL2eQEkW/tkdFyUpgp.rk*R.RQ50nAenYCvhDp3fvvPxM1*VcnOc!/b/dIMAAAAAAAAA&bo=aQTzAQAAAAADB70!&rf=viewer_4)
* 如果想指定jniLibs文件路径可以在app - build.gradle 下配置:
```
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
```
#### 最后
* 需要注意:
* .h文件要移动到 jni文件夹下
* CMake下载注意版本 starlancer 发表于 2019-9-18 11:24
这个编写了有什么用处?
引用 “会飞的丑小鸭” 《教我..》第六帖编写so 中的介绍:
Android开发中,我们经常会用到.so文件。原因有很多,比如部分方法不想暴露,如加密规则。比如部分秘钥需要存储,哪怕最简单的一个String我们使用.so调用获取这个String,也比直接明文写在代码中要来的安全。 cmputer 发表于 2020-4-10 16:40
这里javac MyJNI.java才对吧
是的是的,我的失误,流程顺序 可看 https://www.52pojie.cn/thread-706568-1-1.html 这篇,写此篇初衷只是为了说明AS 3.X版本 如何编写So库 学习了 谢谢大佬 整挺好的 辛苦楼主了哈~ so cool,man 不错,挺好的教材。 什么时候能教教怎么写安卓的HAL和驱动 膜拜大佬 这个编写了有什么用处?
页:
[1]
2