一、新建native C++项目,填写好项目信息,一路下一步即可

2023安卓逆向 -- JNI学习(从开发到反编译)_字符串

2023安卓逆向 -- JNI学习(从开发到反编译)_java字符串_02

二、创建好项目,直接点击运行,出现下面界面,说明我们的环境都没有问题

2023安卓逆向 -- JNI学习(从开发到反编译)_java字符串_03

三、Java层调用java层函数

1、新建一个Java Class,命名为JavaFun

2023安卓逆向 -- JNI学习(从开发到反编译)_java字符串_04

2、编写java函数

package com.example.jnitest;


public class JavaFun {
    public static String strfun(){
        return "公众号:逆向有你";
    }
}

3、主函数调用

TextView tv = binding.sampleText;
        String str=JavaFun.strfun();
        tv.setText(str);

4、运行结果

2023安卓逆向 -- JNI学习(从开发到反编译)_java字符串_05

四、Java层调用C层函数

1、新建一个C文件,命名为CFun

2023安卓逆向 -- JNI学习(从开发到反编译)_java字符串_06

2023安卓逆向 -- JNI学习(从开发到反编译)_Java_07

2、修改一下Cmake文件,具体内容下,就是告诉该项目,我要生成一个叫做CFun的so文件

add_library( # Sets the name of the library.
        CFun


        # Sets the library as a shared library.
        SHARED


        # Provides a relative path to your source file(s).
        CFun.c)
        
target_link_libraries( # Specifies the target library.
        jnitest CFun


        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

3、回到刚新建的C文件,电机一下Sync Now同步一下,就不会飘红报错了

2023安卓逆向 -- JNI学习(从开发到反编译)_java字符串_08

4、回到Java层声明一个函数

public static native String Cstrfun(String v1, String v2);

5、把鼠标放到Cstrfun函数上面,按Alt+回车,去C文件里实现该函数

2023安卓逆向 -- JNI学习(从开发到反编译)_java字符串_09

2023安卓逆向 -- JNI学习(从开发到反编译)_java字符串_10

6、C文件里面会自动添加如下代码,我们只要填写要实现的内容即可

#include <jni.h>




JNIEXPORT jstring JNICALL
Java_com_example_jnitest_JavaFun_Cstrfun(JNIEnv *env, jclass clazz, jstring v1, jstring v2) {
    // TODO: implement Cstrfun()
}

7、具体实现函数内容,直接返回v1+v2

//将java字符串转换为C字符串
    char *c1 = (char *) (*env)->GetStringUTFChars(env,v1, JNI_FALSE);
    char *c2 = (char *) (*env)->GetStringUTFChars(env,v2, JNI_FALSE);
    //拼接两个字符串
    char *res = strcat(c1, c2);
    //将C字符串转换为java字符串返回
    return (*env)->NewStringUTF(env,res);

8、主函数调用

TextView tv = binding.sampleText;
        String str=JavaFun.Cstrfun("公众号:","逆向有你!!!");
        tv.setText(str);

9、加载SO文件

System.loadLibrary("CFun");

五、反编译

1、将生成的apk拖入jadx中,找到了关键函数Cstrfun

2023安卓逆向 -- JNI学习(从开发到反编译)_Java_11

2、查看调用该函数是原生函数

2023安卓逆向 -- JNI学习(从开发到反编译)_Java_12

3、解压该app,将CFun.so拖进ida中双击进入,我们要分析的函数

2023安卓逆向 -- JNI学习(从开发到反编译)_字符串_13

2023安卓逆向 -- JNI学习(从开发到反编译)_字符串_14

4、通过编程的时候我们知道,jni函数一般第一个参数都是JNIEnv类型,所以,我们按键盘y,快捷修改

2023安卓逆向 -- JNI学习(从开发到反编译)_Java_15

5、这样看着就很好理解了

2023安卓逆向 -- JNI学习(从开发到反编译)_java字符串_16