Android逆向之旅-Android Studio的调用So文件极简教程
创始人
2024-06-02 14:58:32
0

一、配置so需要的库环境

高版本的Android Studio已经集成了LLDB调试库,所以说,大家不要在找为什么没有,该从哪里去找。现在很多教程都是老的,这个算是我用的这个版本的最新方法,踩坑版。
File->setting

二、创建so文件的工程

直接选择最后一个
File->New project

配置自己按喜好配

 

配置完成后在Project模式下查看是这样的。

 

 函数名: Java_com_example_myjniapp_MainActivity_stringFromJNI

函数名代表了一个映射关系

 这个native方法的命名方式往往是包名_类名_方法名(并非绝对)。

static {System.loadLibrary("native-lib");
}@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// Example of a call to a native methodTextView tv = findViewById(R.id.sample_text);tv.setText(stringFromJNI());
}/*** A native method that is implemented by the 'native-lib' native library,* which is packaged with this application.*/
public native String stringFromJNI();

想要哪个函数与C++通信,那么哪个函数前面就需要有"native"字样表示。在MainActivity最后的stringFromJNI函数是需要生成so文件被调用的。

三、 编译so文件

build ->make project

 编译生成so文件,build->intermediates->cmake->debug/release/obj目录下面

 

四、so文件存放

编译完成后,接下来是该如何使用编译好的so文件。

1)使用jniLibs文件夹

  • 在app->src->main中创建一个叫做:jniLibs文件夹。
  • 把 cmake编译的so文件放入这里,就算配置完成了。
  • 不用和网上大多数教程一样去修改app文件夹下的"build.gradle"

2)使用libs文件夹(不建议)

用这个文件夹的好处就是不需要再去创建新的文件夹了,
把 cmake编译的so文件放入app文件夹下的libs文件夹
但是还需要额外的配置app文件夹下的"build.gradle"。
在build.gradle文件里面添加上这一段代码,指定libs代替jniLibs的作用即可,不需要添加其他代码!!!
此时,so文件所需的内容就已经配置完成了。

sourceSets {main{main.jni.srcDirs = []main.jniLibs.srcDirs = ['libs']}
}

更改build.gradle文件后需要Sync(同步)

 

五、使用so文件

在中间键文件:native-lib.cpp中,有一个默认的函数,函数名是:Java_com_example_myjniapp_MainActivity_stringFromJNI

当我们在调用so的位置也需要按照so中函数名的方式创建一个一模一样的路径,并且类名叫做:MainActivity,有一个叫做stringFromJNI的函数,只有这样才会调用成功。

调用方式其实上面的类里有。

要对接给外部团队或第三方使用的话可以构建一个中间模块,用这个包名和类名,使用一个JNIInterface类来加载so,提供so调用的方法

public class JNIInterface {static {System.loadLibrary("native-lib");}/*** A native method that is implemented by the 'native-lib' native library,* which is packaged with this application.*/public native String stringFromJNI();}

外部实现创建这个类的实例,就可以调用了

    public JNIInterface jniInterface = new JNIInterface();//使用 jniInterface.stringFromJNI();

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...