java访问静态方法实现原理:
JVM在系统层会将运行的相关类名加载到虚拟机中去,
为动态加载过程,用到的时候才会加载。
类加载器ClassLoader把静态方法class加载进入jvm中。加载
获取jclass
通过jobject搜索class,如果找到了,将这个class转变成
jclass然后返回
获取方法Id
转换Stirng格式
将uuid和.txt拼接
创建一个buffer
因为Date是系统函数,所以JVM虚拟机已经自动加载过了。因此给出路径就可以
顺着找到其Class,类比java代码:Date.Class
所以要使用findClass。注意区别getObjectClass
通过类的路径来从JVM里面找到对应的类。找Date的class是因为要使用Date的构造函数。
<init>:对所有的构造方法的零置,访问构造方法的方法签名
调用newobjet实例化一个Date对象,返回值jobject
得到对应对象的方法,前提是我们访问了相关对象的构造函数创建了对象
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