day11-JNI介绍

发布时间 2023-10-21 14:44:48作者: hanfe1

四 JNI介绍和安装

4.1 JNI介绍

JNI,java native interface ,Java本地开发接口,实现在安卓中JAVA和C语言之间的相互调用。

# 之前写安卓,全是用java写
# 后期可以用c写安卓,写了后,需要使用java调用c的方法,完成功能

image-20231021143121168

4.2 NDK安装

NDK是JNI开发的工具包

NDK,Native Develop Kits,本地开发工具(在Android Studio中下载即可)

image-20231021143137705

五 创建JNI项目

# 普通项目:Empty Activity(Java) 

# jni项目:Native C++(Java + C)
创建的项目多了一些内容和配置(基于C++实现了一个算法,并在Java中进行了调用)。
    - 有了默认配置后,我们就不需要自己的手动配置了。
    - 会生成一些我们用不到的默认文件,等我们学会自己再回来删除他默认的这些文件。

5.1 创建项目

image-20231021143155807

5.2 快速开发

# 1 第一步:在cpp目录下,新建c文件[注意选择c结尾]
#include <jni.h>
JNIEXPORT jint
JNICALL Java_com_justin_s8day12_Utils_v1(JNIEnv *env, jclass clazz,jint v1,jint v2) {
    return v1+v2;
}

# 2 第二步:编写Java,新建一个Java类,编写静态方法
package com.justin.s8day12;
public class Utils {
    public static native int v1(int a1,int a2);
}

# 3 第三步:在java类中,引入静态文件
    static {
        System.loadLibrary("utils");
    }
    
# 4 第四步:在CMakeLists.txt中加入编写的c文件
	add_library(
        utils # 起个名字,我们叫utils
        SHARED
        # 指定我们新建的c文件
        utils.c)
    
    
    target_link_libraries(
        utils# 加入我们自己写的utils,空格分割,写多个
        ${log-lib})
    
 # 5 在java代码中调用
tv.setText(String.valueOf(Utils.v1(33,44)));

5.3 逆向和反编译

# 1 反编译 apk
	-把咱们自己写的apk,拖动到jadx中即可
    
# 2 反编译so文件
	-使用压缩工具把 apk解压
    -进入lib的arm64-v8a目录,看到so文件
    -把so文件拖动到IDA中
    -选择exports导出
    -双击函数名,看到汇编
    -按F5,把混编进行反编译
    

image-20231021143431253

image-20231021143438965

image-20231021143447687

image-20231021143506606

image-20231021143512869

image-20231021143520528