← 返回首页
JNI参数类型类型对齐

JNI 参数类型对齐:Java 层的对象到了 native 层到底是什么

做 JNI 动态分析时,很多人只关注函数名和返回值,却忽略了最关键的一步:参数类型对齐。Java 层的 Stringbyte[]int 到了 native 层会变成什么?如果没搞清楚这个,hook 时看到的参数可能完全对不上号。

先说结论:JNI 参数对齐是桥接层分析的基础

Java 和 native 的类型系统差异很大:

你不先对齐类型,后面看参数就是在猜。

JNI 参数对齐的核心,是把 Java 语义和 native 表示一一对应起来。

最常见的类型映射

Java 类型JNI 类型说明
intjint32 位有符号整数
longjlong64 位有符号整数
booleanjboolean无符号 8 位,0 或 1
byte[]jbyteArray需要 GetByteArrayElements 访问
Stringjstring需要 GetStringUTFChars 转换
ObjectjobjectJava 对象引用

为什么类型对齐这么重要?

因为:

你没对齐类型,hook 时看到的参数值可能完全不是你想象的那样。

动态分析时的对齐策略

  1. 先看 Java 层声明的签名
  2. 确认每个参数在 native 层的类型
  3. 对数组和字符串做必要的转换
  4. 对象类型需要进一步获取字段值

这套流程看着繁琐,但能让你看到的参数真正有意义。

最容易犯的错误

结尾

JNI 参数类型对齐不是繁琐的仪式感,而是让动态分析结果真正可靠的基础。你只要把类型映射搞清楚,很多原本看起来奇怪的现象都会变得合理。

上一篇RegisterNatives 定位思路:JNI 动态注册别只看 OnLoad,要把绑定表掏出来 下一篇JNI 动态 Hook 路径:别只看 Java.perform,要盯桥两端的数据变化