范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

阿里面试官讲解一下JNI的三种引用

  从Java虚拟机创建的对象传到本地 C/C++ 代码时就会产生引用。根据Java的垃圾回收机制,只要有引用存在就不会触发该引用指向的Java对象的垃圾回收。这些引用在 JNI 中分为三种
  全局引用 (Global Reference)
  局部引用 (Local Reference)
  弱全局引用 (Weak Global Reference), JDK 1.2 引入1. 局部引用
  最常见的引用类型,基本上通过JNI返回来的引用都是局部引用
  例如,使用NewObject就会返回创建出来的实例的局部引用。局部引用只在该native函数中有效,所有在该函数中产生的局部引用,都会在函数返回的时候自动释放(freed)。也可以使用DeleteLocalRef函数进行手动释放该引用。
  想一想既然局部引用能够在函数返回时自动释放,为什么还需要DeleteLocalRef函数呢?
  实际上局部引用存在,就会防止其指向的对象被垃圾回收。尤其是当一个局部引用指向一个很庞大的对象,或是在一个循环中生成了局部应用;最好的做法就是在使用完该对象后,或在该循环尾部把这个引用释放掉,以确保在垃圾回收器被触发的时候被回收。
  在局部引用的有效期中,可以传递到别的本地函数中,要强调的是它的有效期仍然只在一次的Java本地函数调用中,所以千万不能用C++全局变量保存它或是把它定义为C++静态局部变量。2. 全局引用
  全局引用可以跨越当前线程,在多个native函数中有效,不过需要编程人员手动来释放该引用。全局引用存在期间会防止在Java的垃圾回收的回收。
  与局部引用不同,全局引用的创建不是由 JNI 自动创建的,全局引用需要调用 NewGlobalRef 函数,而释放它需要使用 ReleaseGlobalRef 函数。3. 弱全局引用
  弱全局应用是 JDK 1.2 新出来的功能,与全局引用相似,创建跟释放都需要由编程人员来进行操作。这种引用与全局引用一样可以在多个本地代码有效,也可以跨越多线程有效;不一样的是,这种引用将不会阻止垃圾回收器回收这个引用所指向的对象。
  使用 NewWeakGlobalRef 跟 ReleaseWeakGlobalRef 来产生和释放应用。4. 关于引用的一些函数jobject NewGlabalRef(jobject obj); jobject NewLocalRef(jobject obj); jobject NewWeakGlobalRef(jobject obj); void DeleteGlobalRef(jobject obj); void DeleteLocalRef(jobject obj); jboolean IsSameObject(jobject obj1, jobject obj2);
  IsSameObject 函数对于弱引用全局应用还有一个特别的功能,把NULL传入要比较的对象中,就能够判断弱全局引用所指向的Java对象是否被回收。5. 缓存jfieldID / jmethodID
  获取 jfieldID与jmethodID 的时候会通过该属性/方法名称加上签名来查询相应的 jfieldID/jmethodID。这种查询相对来说开销较大。在开发中可以将这些 FieldID/MethodID 缓存起来,这样就只需要查询一次,以后就使用缓存起来的 FieldID/MethodID。
  下面介绍两种缓存方式
  在使用时缓存 (Caching at the Point of Use)
  在Java类初始化时缓存 (Caching at the Defining Class"s Inititalizer)5.1 在使用时缓存
  在native 代码中使用static局部变量来保存已经查询过的jfieldID/jmethodID ,这样就不会在每次的函数调用时查询,而只要一次查询成功后就保存起来了。JNIEXPORT void JNICALL Java_Test_native( JNIEnv* env, jobject ojb) { static jfieldID fieldID_str = NULL; jclass clazz = env->GetObjectClass( obj ); if(fieldID_str == NULL){ fieldID_str = env->GetFieldID(clazz, "strField", "Ljava/lang/String"); } //TODO Other codes }
  不过这种情况下,就不得不考虑多线程同时调用此函数时可能导致同时查询的并发问题,不过这种情况是无害的,因为查询同一个属性或者方法的ID,通常返回的值是一样的。5.2 在Java类初始化时缓存
  更好的一个方式就是在任何native函数调用之前把id全部缓存起来。
  可以让Java在第一次加载这个类的时候,首先调用本地代码初始化所有的 jfieldID/jmethodID,这样的话就可以省去多次判断id是否存在的冗余代码。当然,这些 jfieldID/jmethodID 是定义在C/C++ 的全局。
  使用这种方式还有好处,当Java类卸载或者重新加载的时候,也会重新调用该本地代码来重新计算IDs。
  java代码public class TestNative { static { initNativeIDs(); } static native void initNativeIDs(); int propInt =0; String propStr = ""; public native void otherNative(); //TODO Other codes }
  C/C++ 代码 //global variables jfieldID g_propInt_id = 0; jfieldID g_propStr_id = 0; JNIEXPORT void JNICALL Java_TestNative_initNativeIDs( JNIEnv* env, jobject clazz){ g_propInt_id = env->GetFieldID(clazz, "propInt", "I"); g_propStr_id = env->GetFieldID(clazz, "propStr", "Ljava/lang/String;"); } JNIEXPORT void JNICALL Java_TestNative_otherNative( JNIEnv* env, jobject obj){ // TODO get field with g_propInt_id/g_propStr_id }6. 总结
  最简单的Java调用C/C++函数的方法
  获取方法/属性的ID;学会了获取/设置属性;还有Java函数的调用
  Java/C++之间的字符串的转换问题
  在C/C++下如何操作Java的数组
  三种引用方式
  如何缓存属性/方法的ID7. 回顾
  使用了JNI,那么这个Java应用将不能跨平台了。如果要移植到别的平台上,那么native代码就需要重新进行编写
  Java是强类型的语言,而C/C++不是。因此,必须在写JNI时倍加小心
  总之,必须在构建Java程序的时候,尽量不用或者少用本地代码
  附
  异常处理
  C/C++ 如何启动JVM
  JNI与多线程《The Java Native Interface Programmer"s Guide and Specification》
  《JNI++ User Guide》

并发ListSetConcurrentHashMap底层原理剖析ArrayListList特点元素有放入顺序,元素可重复。存储结构底层采用数组来实现的。源码publicclassArrayListEextendsAbstractListEimp小米5080mAh新机爆发,181TB定价7999,雷军野心变大了小米这个手机品牌现在专门走高端路线了,大家可以看到,这两年以来,在小米手机品牌中基本不再有千元机面世。其实小米的性价比任务已经完全移交给红米,雷军是想把小米打造成和三星华为苹果一样ipadminior联想拯救者y700?想拯救者平板Y700,m,这可能是首款小尺寸安卓电竞平板。8。8英寸大小,单手可握,搭载骁龙870处理器,2K120Hz的屏幕,双X轴线性马达和JBL双扬声器,更有极为罕见的3。5JavaScript两个变量交换值(不使用临时变量)概要本文主要描述,如何不使用中间值,将两个变量的值进行交换。前三种只适用于number类型的数值交换,第四和第五种适合其他类型。一普通做法vara1,b2,tmptmpaabbtmansible之playbookansibleplaybookplaybookyml说明playbook由一个或多个play组成。playbook中每个play必须包含hosts和tasks。playbook以yweb前端diff算法深入一下?一前言有同学问能否详细说一下diff算法。简单说diff算法是一种优化手段,将前后两个模块进行差异化比较,修补(更新)差异的过程叫做patch,也叫打补丁。详细的说,请阅读这篇文章影响手机拍照成像水平的有哪些方面?每次看小米新品发布会时都能听到。我们小米的产品采用1亿像素摄像头。让我以为是小米手机的拍照成像是在业内一个最高的水准。但是经过我的多方面认证,去实体店对比。发现像素并不能决定一切。小米新手机外壳曝光5月发布会将发新机?昨晚行业中曝光了小米新手机的外壳,目前已经确定的是该机并不是5月即将发布的MIX系列,而是civi2手机,将会大几率将在5月的小米发布会中亮相。从手机背部的开孔来看,摄像头模组将有怎么开机用u盘重装系统怎么开机用u盘重装系统,首先第一步将我们的这个u盘插入那个电脑的usb接口这款是微钢30的是双启动这款是闪迪的插入以后那么电脑你要重启计算机然后重启计算机出它会出现一个品牌的画面大华为多款新品曝光,三月发布5G新机,鸿蒙OS3。0和Mate50再确定对于华为粉丝来说,现在最关注的两个产品,一个是鸿蒙OS3。0到底什么时候公测,一个是华为Mate50系列到底何时发布。恰好,这两款产品最近都传出了新的消息,下面咱们就来一起说道说道华为mate40pro拍照使用过程的一些感想我用的手机是华为mate40pro,在拍照上配置有三颗镜头,分别是焦距18mm的超广角,焦距23mm的广角,焦距135mm的5倍长焦镜头,使用一段后,在拍照方面有几点看法一拍风景的
科技竞争直戳话语权底牌!中国科创企业如何脱颖而出?去年6月8日美国参议院通过的2021美国创新与竞争法,旨在从国家战略层面推动美国科技发展,加强关键产业的研发与保护,通过政府干预确保美国大科学体系的建设,从而不断拉大与中国的技术差鞭牛晚报罗永浩宣布将打造非元宇宙的下一代平台瑞幸咖啡否认重回纳斯达克上市编者按鞭牛士将以晚报形式盘点今日内发生的重要事件,内容涵盖国际国内科技互联网,为科技行业从业者用户传递行业信息。国内动态1罗永浩宣布将打造非元宇宙的下一代平台今日,罗永浩在微博上转TMT时报传谷歌正在开发AR头盔Meta拟进军NFT市场TikTok拟推出付费订阅模式科创板日报1月20日讯,今日TMT要闻精选主要内容有人社部等4部门再次对11家平台企业保障新就业形态劳动者权益开展行政指导谷歌正在开发AR头盔,最快2024年上市TikTok拟推出情报雷尔娱乐2022年1月新品发布星辰大海系列前言雷尔,2022年新品发布。这次题材是什么?是星辰大海系列。那产品怎么样?max带你看一下。letsgo星辰大海雷尔娱乐60013,202pcs,摘星太空人星际漫游高砖零件,成品TMT时报7家上市公司入选中移动元宇宙产业委员会第二批成员名单阿里文娱改由子公司持有优酷信息印度的第一次元宇宙婚姻来了科创板日报17日讯,今日TMT时报内容有中移动元宇宙产业委员会第二批成员名单公布,7家上市公司入选字节最新回应减小低协同性投资分散员工至各业务线中信建投后市看涨美团W(03690)中国这么多高薪程序员为什么开发不出Java,Typescript,Python?近日,有人在网上问了这个问题,引起了网友热议为什么中国这么多高薪程序员,开发不出Java,Typescript,Python,Rust,Node。js这些基础设施?对这个问题,大家比尔盖茨与中国合作,联合开发第四代核电技术,最后为啥没成?文老史编辑老史世界前首富比尔盖茨从来就不是一个不安寂寞的人,也许是智能手机出现以后,盖茨发现卖电脑不怎么赚钱,所以开始倒腾起了新项目核电。比尔盖茨找了无数个合作伙伴但被婉拒,最后就老手机别卖别扔!也许它还能安装Windows11系统哦2017年底,高通和微软就携手提出了AlwaysConnectedPC的概念,随后我们便看到多款骁龙笔记本,而高通也为WindowsonARMPC定制了骁龙8cx(如今已经升级到GiPhoneSE3基本确认一个好消息,一个小遗憾,果粉没有白等iPhone13发布后,iPhone11iPhone12mini都降到了3500元价位。此时,搭载A13芯片的iPhoneSE2,不管是性价比,还是实用性,都有着明显的劣势,在市场2021年山东消费市场繁荣活跃新能源汽车热度高2022年1月19日下午,省政府新闻发言人和省发展改革委省工业和信息化厅省商务厅省统计局负责人介绍2021年全省经济社会运行情况。2021年,山东省紧盯扩大内需战略基点,持续提升全京东自营不靠谱TCL京东自营官方旗舰店,竟然如此的不靠谱。1月19号下午,本人在京东APP的TCL京东自营官方旗舰店下单购买了3台TCl空调,型号是KFRd35GWDXG21Bp(B1),单价2