一、新建native C++项目,填写好项目信息,一路下一步即可
二、创建好项目,直接点击运行,出现下面界面,说明我们的环境都没有问题
三、Java层调用java层函数
1、新建一个Java Class,命名为JavaFun
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、运行结果
四、Java层调用C层函数
1、新建一个C文件,命名为CFun
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同步一下,就不会飘红报错了
4、回到Java层声明一个函数
public static native String Cstrfun(String v1, String v2);
5、把鼠标放到Cstrfun函数上面,按Alt+回车,去C文件里实现该函数
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
2、查看调用该函数是原生函数
3、解压该app,将CFun.so拖进ida中双击进入,我们要分析的函数
4、通过编程的时候我们知道,jni函数一般第一个参数都是JNIEnv类型,所以,我们按键盘y,快捷修改
5、这样看着就很好理解了