Android逆向之旅-Android Studio的调用So文件极简教程

一、配置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 method
    TextView 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();

猜你喜欢

转载自blog.csdn.net/u013773608/article/details/129486813