Jni访问java的属性,方法

来源:互联网 发布:mac看视频发热严重 编辑:程序博客网 时间:2024/05/16 00:56

基本属于翻译。

 

首先必须存在之前传入的jobject obj,在根据 JNIEnv来获取jclass。

jclass cls = (*env)->GetObjectClass(env, obj);
当获取的jclass之后,也就知道该class的排布,之后开始获取相关的field。
  jfieldID fid = (*env)->GetFieldID(env, cls, "s", "Ljava/lang/String;");
之后就是对于field的解析工作,这里这个是string,由于需要返回的是具体instance中的树枝,所以这里需要obj。
jstring jstr = (*env)->GetObjectField(env, obj, fid);

如果是int等primitive参数,使用GetIntField系列的就好。

 

jni区域标识符

 

这个标识符用来描述区域的表示,已L开始,[代表数组, [I是int类型的数组,并且已分号结尾。

如果是类的应用,例如java.lang.String

书写为"Ljava/lang/String;"

 

具体的表格如下

 

Field Descriptor
Java Language Type
Z
boolean
B
byte
C
char
S
short
I
int
J
long
F
float
D
double

 

Field Descriptor
Java Language Type
"Ljava/lang/String;"
String
"[I"
int[]
"[Ljava/lang/Object;"

Object[]

 

可以利用工具javap来检查

 

javap -s -p YouClass

s Ljava/lang/String;
这里的函数的描述符。顺序是(param)returntype,其中参数和参数之间无需加任何符号。
Method Descriptor
Java Language Type
"()Ljava/lang/String;"
String f();
"(ILjava/lang/Class;)J"
long f(int i, Class c);
"([B)V"
String(byte[] bytes);
javap效果,如下
javap -s -p InstanceMethodCall

private callback ()Vpublic static main ([Ljava/lang/String;)Vprivate native nativeMethod ()V
实例代码,如果在C中启动Runnable的run函数
jobject thd = ...; /* a java.lang.Thread instance */jmethodID mid;jclass runnableIntf =     (*env)->FindClass(env, "java/lang/Runnable");          /*或者这里可以使用GetObjectClass来获取jclass*/if (runnableIntf == NULL) {    ... /* error handling */}mid = (*env)->GetMethodID(env, runnableIntf, "run", "()V");if (mid == NULL) {    ... /* error handling */}(*env)->CallVoidMethod(env, thd, mid);... /* check for possible exceptions */
C中回调java的函数
Call<type>Method----其中type代表该函数的返回值
每次都这作样的查找必然会损伤效率,这里缓存查找的结果
有2中方式,一种是在首次使用的时候,一种是在初始化的时候
1.首次使用很简单。
if(NULL = field_id) field_id = (*env)->GetXXXX
2.在构造中初始化其实是对于1方案的改进,因为1方案无法解决多线程重入判断的语句,而且还多了一条if语句,不符合追求最高性能的方法
class InstanceMethodCall {    private static native void initIDs();    private native void nativeMethod();    private void callback() {        System.out.println("In Java");    }    public static void main(String args[]) {        InstanceMethodCall c = new InstanceMethodCall();        c.nativeMethod();    }    static {        System.loadLibrary("InstanceMethodCall");        initIDs();    }}
其中 ,利用构造函数最先被调用的特点来初始化
JNIEXPORT void JNICALL Java_InstanceMethodCall_initIDs(JNIEnv *env, jclass cls){    MID_InstanceMethodCall_callback =        (*env)->GetMethodID(env, cls, "callback", "()V");}
 JNIEXPORT void JNICALL  Java_InstanceMethodCall_nativeMethod(JNIEnv *env, jobject obj) {     printf("In C/n");     (*env)->CallVoidMethod(env, obj,                            MID_InstanceMethodCall_callback); }

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小学闺蜜嫉妒我怎么办 三年级孩子对应用题理解很差怎么办 我嫉妒我的朋友怎么办 嫉妒同学比我好怎么办 宝宝生在家里了怎么办 在家不小心生了怎么办 葫芦干了有黑点怎么办 单位费用发票丢失了怎么办 1岁宝宝太调皮了怎么办 孩子和同学打架家长该怎么办 孩子被大人打了怎么办 小孩不跟大人沟通怎么办 2岁小朋友爱动手怎么办 小班爱动手的小朋友怎么办 宝宝对小朋友不友好爱动手怎么办 小孩子上幼儿园爱打人怎么办 小孩被别人打了怎么办 1岁幼儿爱打人怎么办 作为幼小朋友打人老师怎么办 2岁半小朋友喜欢打人怎么办 2岁宝宝脾气大怎么办 4月小孩爱动怎么办 一岁宝宝老打人怎么办 1岁宝宝爱打人怎么办 3岁宝宝喜欢抓人怎么办 宝宝喜欢打人怎么办2岁 1岁宝宝动手打人怎么办 孩子总打人总哭怎么办 小孩出现夜惊家人怎么办 小孩不原跟家人沟通怎么办 孩子字写得难看怎么办 孩子上一年级不认识字怎么办 二年级孩子语文差怎么办 孩子二年级语文成绩差怎么办 孩子小学二年级语文差怎么办 二年级孩子语文理解能力差怎么办 深圳租房被坑了怎么办 小鸣单车押金退不了怎么办 联想台式一体机忘记密码怎么办 ps直线工具变成箭头了怎么办 笔记本图形处理速度慢怎么办