Java 的反射机制:例如有一个类:
Packge com.example.test
Class Utils{
System.LoadLibriry(“lib”);
public int add(int x,int y) {
return x+y;
}
public static native cCallJava();
}
用以上代码举例:
1. 得到类 Utils 对应的字节码
Class clazz=Utils.class;
2. 得到要调用的方法名
Method method=clazz.getDeclaredMethod(“add”,int.class,int.class) ;
3. 得到要调用的方法对应的类的实例
Object obj=clazz.newInstance();
4. 调用方法
int result=method.invoke(obj,99,1) ;
运行结果是 100;
在 JNI 中使用 java 反射机制
1 得到类对应的字节码
Jclass jclazz=(*env)->FindClass(env,”com/example/test/Utils”);// 包名以及类
名之间用/隔开
2 得到要调用的方法
第二个参数:字节码
第三个参数:类名
第四个参数:方法签名
JmethodId jmethodid==(*env)->GetMethodID(env,jclazz,”add”,”方法签名”);
GetMethodID 是非静态方法用的方法,如果是静态方法则用 GetstaticMethodID
3 得到要调用的方法对应的实例
Jobject jobjs=(*env)->AllocObject(env,jclazz);
4 调用方法
第二个参数:实例
第三个参数:方法
第四个参数:参数一
第五个参数:参数二
Int resut=(*env)->CallIntMethod(env,jobjs,jmethodid,99,1);
CallIntMethod 这是有返回值是 int 的方法,如果没有返回值就调用 CallvoidMethod
如果是静态的方法则用 CallstaticIntMethod 或者 CallStaticvoidMethod
得到方法签名:进入项目 classes 目录下执行命令 javap-s+全类名(包名+类名 用逗
评论0
最新资源