jni访问java方法

java访问静态方法实现原理:


JVM在系统层会将运行的相关类名加载到虚拟机中去,
为动态加载过程,用到的时候才会加载。
类加载器ClassLoader把静态方法class加载进入jvm中。加载

失败时会报错报

java.lang.ClassNotFoundException

jni去访问静态方法时和jvm访问静态方法非常类似


获取jclass

通过jobject搜索class,如果找到了,将这个class转变成
jclass然后返回
(*env)->GetObjectClass(env,jobj)




获取方法Id
jmethdId jmid = (*env)->GetStaticMethodID
(env,clz,"方法签名","fid")




调用静态方法

非静态去掉static,返回值为string

jstring uuid = (*env)->CallStaticObjectMethod(env,clz.jmid);



转换Stirng格式
char * uuid_c = (*env)->GetStringUTFChars(env,uuid,NULL);




将uuid和.txt拼接
创建一个buffer

char filename[100]
sprintf(filename,"D://%s.txt",uuid_c)


FILE *fp = fopen(filename, "w");


jni访问java构造方法:


现有java代码

pubic native Date accessConstrctor();


因为Date是系统函数,所以JVM虚拟机已经自动加载过了。因此给出路径就可以
顺着找到其Class,类比java代码:Date.Class
所以要使用findClass。注意区别getObjectClass


通过类的路径来从JVM里面找到对应的类。找Date的class是因为要使用Date的构造函数。
jclass jcl = (*env)->FindClass(env,"java/util/Date");



<init>:对所有的构造方法的零置,访问构造方法的方法签名
jmethodID jmid = (*env)->GetMethodID(env,jcl,"<init>","()V");



调用newobjet实例化一个Date对象,返回值jobject
jobject(*env)->NewObject(env,jcl,jmid);



得到对应对象的方法,前提是我们访问了相关对象的构造函数创建了对象

jmethodID tim_mid = (*env)->GetMethodID(env,jcl,"getTime","()J");


jlong time = (*env)->CallLongMethod(env,date_obj,tim_mid);


访问方法的函数通常为Call





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值