{
  "added_at": "2026-11-02",
  "additional_evidence_urls": [
    "https://github.com/evilpan/jni_helper/blob/04b844c43438c2c0bbef29bf9b9695e5aba9a4bc/extract_jni.py",
    "https://github.com/evilpan/jni_helper/blob/04b844c43438c2c0bbef29bf9b9695e5aba9a4bc/requirements.txt",
    "https://github.com/evilpan/jni_helper/blob/04b844c43438c2c0bbef29bf9b9695e5aba9a4bc/ghidra/README.md",
    "https://github.com/evilpan/jni_helper/blob/04b844c43438c2c0bbef29bf9b9695e5aba9a4bc/ida/README.md",
    "https://github.com/evilpan/jni_helper/blob/04b844c43438c2c0bbef29bf9b9695e5aba9a4bc/binary_ninja/jni_helper.py",
    "https://github.com/evilpan/jni_helper/blob/04b844c43438c2c0bbef29bf9b9695e5aba9a4bc/r2/README.md",
    "https://github.com/evilpan/jni_helper/blob/04b844c43438c2c0bbef29bf9b9695e5aba9a4bc/headers/jni.h",
    "https://github.com/evilpan/jni_helper/blob/04b844c43438c2c0bbef29bf9b9695e5aba9a4bc/.github/workflows/main.yml",
    "https://github.com/evilpan/jni_helper/releases/tag/v0.6"
  ],
  "category": "android",
  "description_en": "Static helper by evilpan for reverse engineering Android JNI code. Its extract_jni.py script parses an APK's DEX files with Androguard, finds methods declared native, derives each one's mangled Java_ symbol name and C prototype, including overloaded methods, and saves them with the exported Java_ and JNI_OnLoad functions of the APK's arm64-v8a native libraries as a JSON signature file. Scripts for Ghidra, IDA Pro and Binary Ninja load that file and apply the prototypes and JNI types to the matching functions; a radare2 script is a work in progress.",
  "description_zh": "evilpan 开发的 Android JNI 代码静态逆向辅助工具。其 extract_jni.py 脚本用 Androguard 解析 APK 中的 DEX 文件，找出声明为 native 的方法，推导出每个方法（包括重载方法）对应的 Java_ 修饰符号名和 C 函数原型，并连同 APK 中 arm64-v8a 原生库导出的 Java_ 函数和 JNI_OnLoad 一起保存为 JSON 签名文件。面向 Ghidra、IDA Pro 和 Binary Ninja 的脚本读取该文件，把函数原型和 JNI 类型应用到相应函数上；radare2 脚本仍在开发中。",
  "entry_url": "https://awesomerea.org/resources/jni-helper/",
  "entry_url_zh": "https://awesomerea.org/zh/resources/jni-helper/",
  "evidence_url": "https://github.com/evilpan/jni_helper/blob/04b844c43438c2c0bbef29bf9b9695e5aba9a4bc/README.md",
  "group": "tools",
  "id": "jni-helper",
  "json_url": "https://awesomerea.org/resources/jni-helper/record.json",
  "kind": "tool",
  "markdown_url": "https://awesomerea.org/resources/jni-helper/index.md",
  "markdown_url_zh": "https://awesomerea.org/zh/resources/jni-helper/index.md",
  "name": "jni_helper",
  "name_zh": "jni_helper JNI 函数签名提取工具",
  "record_type": "resource",
  "relationship": "foundation",
  "requirements": [
    "Latest release at review: v0.6, published 2024-10-23, whose only asset is the demo APK built by CI; the reviewed master commit of 2025-02-24 only updates a README link. CI builds the demo app with JDK 17 and runs extract_jni.py on it as its only test, without checking the output or exercising the disassembler scripts.",
    "extract_jni.py needs Python 3 with androguard, rich and pyelftools from requirements.txt and takes an APK the analyst already has; it reads native libraries only from lib/arm64-v8a. Methods bound at run time through RegisterNatives are not covered, which the README lists as an open TODO, and the disassembler scripts find functions only by their mangled Java_ symbol names.",
    "The Ghidra script is installed by a Makefile into the ghidra_scripts folder in the user's home directory, together with the bundled jni.h.gdt data-type archive; the IDA plugin has separate versions for IDA Pro before 7.4 and for 7.4 and later; the Binary Ninja script runs from File > Run Script and parses the bundled headers/jni.h. Supported versions of Ghidra, Binary Ninja and radare2 are not stated.",
    "No license file, and GitHub detects none, so reuse terms for the scripts are unstated. Bundled headers keep their own notices: headers/jni.h is Oracle's GPL-2.0 file with the Classpath exception, while r2/jni.h and headers/art_method.h are Android Open Source Project files under Apache-2.0. The demo_apk folder holds the source of the author's test app."
  ],
  "requirements_zh": [
    "审阅时最新版本为 v0.6，发布于 2024-10-23，唯一的附件是 CI 构建的演示 APK；所审阅的 2025-02-24 master 提交只更新了 README 中的一个链接。CI 用 JDK 17 构建演示应用，并在其上运行 extract_jni.py 作为唯一的测试，既不检查输出，也不测试各反汇编器脚本。",
    "extract_jni.py 需要 Python 3 以及 requirements.txt 中列出的 androguard、rich 和 pyelftools，输入为分析者已有的 APK；它只读取 lib/arm64-v8a 中的原生库。运行时通过 RegisterNatives 绑定的方法不在覆盖范围内，README 将其列为尚未完成的待办事项；各反汇编器脚本也只按 Java_ 修饰符号名查找函数。",
    "Ghidra 脚本通过 Makefile 与自带的 jni.h.gdt 数据类型归档一起安装到用户主目录下的 ghidra_scripts 文件夹；IDA 插件分别提供适用于 IDA Pro 7.4 之前版本和 7.4 及以后版本的两个版本；Binary Ninja 脚本通过 File > Run Script 运行，并解析自带的 headers/jni.h。项目未说明所支持的 Ghidra、Binary Ninja 和 radare2 版本。",
    "仓库没有许可证文件，GitHub 也未检测到许可证，因此这些脚本的复用条款并不明确。自带的头文件保留各自的声明：headers/jni.h 是 Oracle 采用 GPL-2.0 并附 Classpath 例外的文件，r2/jni.h 和 headers/art_method.h 则是采用 Apache-2.0 的 Android 开源项目文件。demo_apk 文件夹包含作者测试应用的源码。"
  ],
  "targets": [
    "app",
    "binary"
  ],
  "url": "https://github.com/evilpan/jni_helper",
  "verification": "source-reviewed",
  "verified_at": "2026-10-20"
}
