版权声明:本文为匆忙拥挤repeat(stone)原创文章,转载请注明出处 —— http://blog.csdn.net/jjwwmlp456 https://blog.csdn.net/jjwwmlp456/article/details/89291328
文章目录
jni.h 中 定义了 jmethodID
//java 方法 ID 结构体
struct _jmethodID; /* opaque structure 不透明,即未在本头文件中具体实现 */
typedef struct _jmethodID* jmethodID; /* method IDs */
本地代码中操作 java 方法
先获取 成员方法或静态方法的 jmethodID;
然后根据 java 层的方法, 是否是静态、返回值类型、多态对象中是否要调用父类方法,来调用相关的 Call 方法。
成员方法
jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)
Call[Type]Method(jobject obj, jmethodID methodID, ...)
静态方法
jmethodID GetStaticMethodID(jclass clazz, const char* name, const char* sig)
CallStatic[Type]Method(jclass clazz, jmethodID methodID, ...)
Call 方法重载
- 一般调用 java 层方法时,使用:
Call[Static]TypeMethod
Call[Static]TypeMethodA
Call[Static]TypeMethodV
- 调用 非虚函数(查资料发现是调用 java 中父类的方法,而非子类重写的方法):
CallNonvirtualIntMethod
CallNonvirtualIntMethodV
CallNonvirtualIntMethodA
关于 Call 方法中,最后的参数列表
- 以 Method 结尾;参数用 … 表示
可变参数用 … 表示,调用时 直接一个一个的传入参数即可。一般用这个就可以了
- 以MethodV 结尾;参数用 jvalue* 表示
jvalue*,即 jvalue[],用 jvalue 类型表示一个个参数; 调用时需要构建 jvalue[]
- 以 MethodA 结尾;参数用 va_list 表示
va_list是 c 语言中可变参数宏; 调用时需要构建 va_list
方法签名特征码
Type Signature | Java Type |
---|---|
Z | boolean |
B | byte |
C | char |
S | short |
I | int |
J | long |
F | float |
D | double |
L | fully-qualified-class ; fully-qualified-class |
[ type | type[] |
( arg-types ) return-type | method type |
V | void |
L 表示一个引用对象(String 类型也用它表示),需要 L 开头,后紧跟一个完全限定的类名,结尾还有一个分号;
。
[I 表示一个一维 整型数组。 如 [[Ljava/lang/String; 表示二维String 型数组
() 表示一个参数列表。
如,定义一个 f 方法,与 它的 方法签名:
long f (int n, String s, int[] arr)
==>(ILjava/lang/String;[I)J
javap 获取类的属性、方法签名
使用 jdk 中的工具 javap。
命令:javap -s xxx.class