新建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、这样看着就很好理解了