前言
之前学过JNI的动态注册和静态注册,到目前为止,简单的可以依葫芦画瓢了,但对于细节却还有很多的不知道。因此后面慢慢记录一下。方便自己查阅和学习。
正文
如果不知道静态注册和动态注册的使用,请看《》和《》,这次只关注详细JNI中方法的前两个参数的解释。
在之前JNI静态注册的基础上,加了一个非静态方法hello2(),然后通过javac和javah一系列操作(怎么用具体看《》),得到hello和hello2对应的JNI函数声明。
# Java中静态方法hello public static native String hello(); public native String hello2(); # JNI中对应方法的生命 # 静态hello() JNIEXPORT jstring JNICALL Java_com_biumall_dynamic_one_Hello_hello (JNIEnv *, jclass); # 非静态hello2() JNIEXPORT jstring JNICALL Java_com_biumall_dynamic_one_Hello_hello2 (JNIEnv *, jobject);
这里的hello()方法没有传入其他参数,因此只有两个参数。
参数一
第一个参数都是一样的JNIEnv * env指针。
JNIEnv的类型是一个指针,指向存储全部JNI函数指针的结构。每个函数均可通过JNIEnv参数以固定偏移量进行访问。
推荐看《》查看JNI中定义的函数,至于函数的使用,这里不是重点,暂时略过。
参数二
这个根据本地方法[java中native方法]是否有static而定。
# 静态方法 public static native String hello(); # 非静态方法 public native String hello2();
非静态本地方法
如果是非静态方法,比如上面的hello2(),此时参数二是【对象的引用】,也就是jobject。
# 非静态hello2() JNIEXPORT jstring JNICALL Java_com_biumall_dynamic_one_Hello_hello2 (JNIEnv * env, jobject object){ }
当然,如果你想知道类的引用,可以通过GetObjectClass()方法(函数)获取。
jclass clazz = env->GetObjectClass(object);
静态本地方法
如果是静态方法,比如上面的hello(),此时参数二是【类的引用】,也就是jclass。
# 静态hello() JNIEXPORT jstring JNICALL Java_com_biumall_dynamic_one_Hello_hello (JNIEnv * env, jclass jclazz){ }
当然,如果想知道对象的引用,可以通过AllocObject()方法(函数)获取。
jobject object = env->AllocObject(jclazz);
小结
搞懂第二个参数是类引用还是对象引用很重要,因为调用的方法(函数)需要的参数不一样。
比如:
# 获取FieldID需要类引用 jfieldID intFieldID= env->GetFieldID(clazz, "mValue", "I"); # 获取FieldID中的值,需要对象引用 int intValue = env->GetIntField(object, intFieldID);
如果参数传入错误,运行时就会异常。
参考文章
-
《》
-
《》
-
《》
历史上的今天
暂无评论...
随机推荐
[摘]js中对函数设置默认参数值的3种方法
在javascript中如何为函数设置默认参数值,下面提供几种方法供大家参考。第一种方法:function example(a,b){ var a = arguments[0] ? arguments[0] : 1;//设置参数a的默认值为1 var b = argume...
林清玄:再加两个苹果
一位小学老师对我说起,他怎么使一班小学生被改造的秘诀。他的学生在低年级的时候遇到一个非常严格的老师,给学生的作业很多,而给学生的评价却很低。在这位老师的笔下很少有学生可以得到甲,得到乙已经很不错,有许多学生拿到丙、丁,使得学生的家长对自己的孩子都不谅解,学生对学习也逐渐失去信心了。当这班学生升到...
ViewPager禁止左右滚动
前言项目中需要用ViewPager+Fragment组合使用,比如很见的就是图片暂时。每个客户需求不一样,有些需要左右滑动,有序不需要,因此需要禁止左右滑动切换界面。本文代码是摘的,也验证OK,感谢分享。正文直接上代码,要介绍的可以看摘抄的文章。public class NoScroll...
Android任务栏移除部分应用特殊处理
前言记录一下Android任务栏中去除TopActivity为null的task,以及部分系统应用无法移除就特殊处理。个人流水账而已。正文隐藏内容!付费阅读后才能查看!¥2 ¥3多个隐藏块只需支付一次付费阅读参考文章《Android系统时间无法设置到2038年后问题》
芒克:天空
太阳升起来天空血淋淋的犹如一块盾牌 日子像囚徒一样被放逐没有人来问我没有人宽恕我 我始终暴露着只是把耻辱用唾沫盖住 天空,天空把你的疾病从共和国的土地上扫除干净 可是,希望变成了泪水掉在地上我们怎么能确保明天的人们不悲伤...
git diff提示filemode发生改变
在使用git的时候遇到的,因此摘抄于此。今天clone代码,git status显示修改了大量文件,git diff提示filemode变化,如下:diff --git a/Android.mk b/Android.mkold mode 100644new mode 100755原...