前言
之前学过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);
如果参数传入错误,运行时就会异常。
参考文章
-
《》
-
《》
-
《》
历史上的今天
暂无评论...
随机推荐
[转]Jhuster:Android 音视频开发入门指南
本文转载于Jhuster的《Android 音视频开发入门指南 [直通车]》,只为了自己方便查询,决定系统的学习多媒体开发,感谢大牛的共享。原文如下:最近收到很多网友通过邮件或者留言说想学习音视频开发,该如何入门,我今天专门写篇文章统一回复下吧。音视频这块,目前的确没有比较系统的教程或者书籍,...
Android中图片圆角或圆形记录
前言对图片进行圆角或圆形处理,这个在项目很常用,比如专辑图等。之前项目用过,但没有记录,今天有空就记录一下,方便自己查阅。正文本文记录一下圆形图片或对图片进行圆角处理。效果如图。隐藏内容!付费阅读后才能查看!¥3多个隐藏块只需支付一次付费阅读
Android NDK 部分版本下载
本文摘抄《NDK各版本下载》以便自己下载https://dl.google.com/android/repository/android-ndk-r17b-windows-x86.ziphttps://dl.google.com/android/repository/android-nd...
MySQL忽略大小写简单记录
前言数据库查询时,在查询歌曲ID3信息时,由于存在歌曲名、艺术家或者专辑都存在英文字母,因此搜索时就存在大小写问题。本文简单记录一下查询数据库时忽略大小写遇到的问题。记录于此,方便自己查阅。正文隐藏内容!付费阅读后才能查看!¥1多个隐藏块只需支付一次付费阅读
JNI之函数介绍二
前言今天介绍JNI中全局及局部引用,对象操作,访问对象的域等函数的操作。正文主要涉及全局及局部引用,对象操作,访问对象的域等常用函数。NewGlobalRef jobject NewGlobalRef(JNIEnv *env, jobject obj);建obj 参数所引用对象的新全局...
自定义垂直Seekbar简介之progressDrawable显示优化2
前言之前《自定义垂直Seekbar简介》文章中说过,通过drawBitmap直接画图片时,如果边角存在椭圆就没法正常显示。这里就优化一下,上一个版本的问题,具体效果图如图。正文直接展示效果图(未显示Thumb)可以看出,这里两边都有圆角的。原理主要代码跟《自定义垂直Seekba...