Android逆向 JNI静态注册

1. 新建空白Android项目

打开 ADT 新建Android空白项目 全部默认下一步
file

file

file

file

file

file

2. 新增jni代码

使用jni写的需要用native修饰

file

3. 生成头文件

首先在ADT中新建 jni文件夹

file

右击src文件夹 选择 Properties 查看文件夹路径
这里为 C:\Users\asura\source\repos\Android_JNI\02_JNI_register\Jnidemo\src

file

打开命令行 到达指定的目录执行javah命令

1
javah -jni -d ../jni com.example.jnidemo.MainActivity

刷新ADT后发现jni路径下生成对应的头文件

file

注意!

如果上述操作完全没错,但依然提示找不到xxx的类文件!需要先使用命令来进行切换

1
set classpath=C:\Users\asura\source\repos\Android_JNI\02_JNI_register\Jnidemo\src

4. 编写c++代码和ndk编译配置文件

在jni文件夹内新建文件

com_example_jnidemo_MainActivity.cpp

1
2
3
4
5
6
7
#include "com_example_jnidemo_MainActivity.h"

JNIEXPORT jstring JNICALL Java_com_example_jnidemo_MainActivity_Hello
  (JNIEnv * env, jobject obj)
{
    return env->NewStringUTF("Hello JNI");
}

Android.mk

1
2
3
4
5
6
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm
LOCAL_MODULE    := hello                                    #模块名称
LOCAL_SRC_FILES := com_example_jnidemo_MainActivity.cpp     #源文件名
include $(BUILD_SHARED_LIBRARY)                             #编译为so库文件

Application.mk

1
APP_ABI := x86 armeabi-v7a

file

5. 编译ndk代码

命令行进入jni目录下执行编译命令

1
ndk-build

看到输出.so文件成功则说明编译成功

file

6. java内加载so库和调用

回到java文件中 编写加载so代码的逻辑

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.example.jnidemo;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.Toast;

public class MainActivity extends Activity {

    static {
        System.loadLibrary("hello"); //加载hello模块
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toast.makeText(this,MainActivity.this.Hello(), 1).show(); //调用jni内方法
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    private native String Hello();
}

7. 编译执行

file

相关代码

https://github.com/luodaoyi/Android_JNI/tree/master/02_JNI_register

如果是用android studio 请看NCK大佬的文章

安卓逆向4.Android Studio JNI静态注册(一个简单的JNI静态注册流程) – 凉游浅笔深画眉 – 博客园