JiaYangA 发表于 2019-9-16 16:01

《教我..》系列编写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下载注意版本

JiaYangA 发表于 2019-9-18 11:34

starlancer 发表于 2019-9-18 11:24
这个编写了有什么用处?

引用 “会飞的丑小鸭” 《教我..》第六帖编写so 中的介绍:
Android开发中,我们经常会用到.so文件。原因有很多,比如部分方法不想暴露,如加密规则。比如部分秘钥需要存储,哪怕最简单的一个String我们使用.so调用获取这个String,也比直接明文写在代码中要来的安全。

JiaYangA 发表于 2020-4-13 14:36

cmputer 发表于 2020-4-10 16:40
这里javac MyJNI.java才对吧

是的是的,我的失误,流程顺序 可看 https://www.52pojie.cn/thread-706568-1-1.html 这篇,写此篇初衷只是为了说明AS 3.X版本 如何编写So库

Airmour 发表于 2019-9-17 10:23

学习了 谢谢大佬

soha1018 发表于 2019-9-17 10:59

整挺好的

soulmutou 发表于 2019-9-17 16:21

辛苦楼主了哈~

xixicoco 发表于 2019-9-17 21:07

so cool,man

小夫哥 发表于 2019-9-17 23:43

不错,挺好的教材。

majia4075669072 发表于 2019-9-18 00:10

什么时候能教教怎么写安卓的HAL和驱动

xinxinsoar 发表于 2019-9-18 09:10

膜拜大佬

starlancer 发表于 2019-9-18 11:24

这个编写了有什么用处?
页: [1] 2
查看完整版本: 《教我..》系列编写so -- 使用AndroidStudio 3.X编写so