jni基本操作 3. 操作java中的方法

版权声明:本文为匆忙拥挤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


猜你喜欢

转载自blog.csdn.net/jjwwmlp456/article/details/89291328
今日推荐