推荐肉丝r0ysue课程(包含安卓逆向与js逆向):
项目源码已打包至JNI静态注册so AndroidStudio源码
环境准备
已下载好ndk,并配置好path变量
创建项目
配置External Tools 工具
只用配置一次
File -> Settings -> Tools -> External Tools 添加新工具
配置javah
Program: javah
Parameters: -v -jni -d $ContentRoot$\src\main\jni $FileClass$
Working directory: $SourcepathEntry$
配置ndk-build
Program: # ndk目录下ndk-build.cmd所在路径
Working directory: $ContentRoot$\src\main\
配置项目根目录gradle.properties
android.useDeprecatedNdk=true
配置项目根目录local.properties
(貌似有无都可)
ndk.dir=E\:\\code\\Android\\Sdk\\ndk-bundle
配置app/build.gradle
- 在android下配置sourceSets.main
- 在defaultConfig下配置ndk
defaultConfig {
applicationId "com.forgo7ten.jnitest"
minSdkVersion 16
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndk {
moduleName "MyJnia" //生成的so文件名字,调用C程序的代码中会用到该名字
abiFilters 'x86' // 选择打包进apk中的平台类型 , 'armeabi','x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
}
}
sourceSets.main {
jniLibs.srcDir 'src/main/libs'
jni.srcDirs = [] //disable automatic ndk-build call
}
打包多个平台so文件进入apk包中:多写几个abiFilters
或者多写几个ndk节点
ndk {
moduleName "MyJniaa" //生成的so文件名字,调用C程序的代码中会用到该名字
abiFilters 'armeabi-v7a','x86_64','arm64-v8a','x86' // 增加指定架构下的so库
ldLibs "log" // 额外增加log的lib库
}
编写调用so的java文件
static {
System.loadLibrary("MyJnia"); // 要与app/build.gradle中moduleName相同
}
public static native String hello();
使用javah生成.h头文件
右键调用so的java类,External Tools -> javah
会自动在\src\main\jni目录下生成.h文件
创建相应C文件
//引入上面生成的头文件,并实现头文件中声明的方法
#include "com_forgo7ten_jnitest_MyJni.h"
JNIEXPORT jstring JNICALL Java_com_forgo7ten_jnitest_MyJni_hello
(JNIEnv *env, jobject obj){//方法名是Java_包名_类名_方法名
char *str = "String from native C";
return (*env)->NewStringUTF(env, str);
}
生成jni/Android.mk文件
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
# 编译的so文件的名字,编译器会自动加上lib的前缀和.so的后缀
LOCAL_MODULE :=MyJnia
# 需要编译的C/C++文件
LOCAL_SRC_FILES :=MyJnia.c
include $(BUILD_SHARED_LIBRARY)
生成jni/Application.mk文件
# 生成所有平台的so,或者指定平台'armeabi','x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
APP_ABI := all
编译so
- 在
/src/main/jni/
目录下打开命令行输入ndk-build
- 或者 在jni目录右键External Tools -> ndk-build
配置相应的activity
配置activity,调用so中的方法