保健励志美文体育育儿作文
投稿投诉
作文动态
热点娱乐
育儿情感
教程科技
体育养生
教案探索
美文旅游
财经日志
励志范文
论文时尚
保健游戏
护肤业界

java高级用法之JNA类型映射应该注意的问题

  简介
  JNA提供JAVA类型和native类型的映射关系,但是这一种映射关系只是一个大概的映射,我们在实际的应用中还有很多需要注意的事项,本文将会为大家详细讲解在使用类型映射中可能会出现的问题。一起来看看吧。String
  首先是String的映射,JAVA中的String实际上对应的是两种native类型:constchar和constwchart。默认情况下String会被转换成为char。
  char是ANSI类型的数据类型,而wchart是Unicode字符的数据类型,也叫做宽字符。
  如果JAVA的unicodecharacters要转换成为char数组,那么需要进行一些编码操作,如果设置了jna。encoding,那么就会使用设置好的编码方式来进行编码。默认情况下编码方式是UTF8。
  如果是WString,那么Unicodevalues可以直接拷贝到WString中,而不需要进行任何编码。
  先看一个简单的例子:charreturnStringArgument(chararg){returnarg;}wchartreturnWStringArgument(wchartarg){returnarg;}
  上面的native代码可以映射为:StringreturnStringArgument(Strings);WStringreturnWStringArgument(WStrings);
  再来看一个不同的例子,假如native方法的定义是这样的:intgetString(charbuffer,intbufsize);intgetUnicodeString(wchartbuffer,intbufsize);
  我们定义了两个方法,方法的参数分别是char和wchart。
  接下来看一下怎么在JAVA中定义方法的映射:MappingA:intgetString(byte〔〕buf,intbufsize);MappingB:intgetUnicodeString(char〔〕buf,intbufsize);
  下面是具体的使用:byte〔〕bufnewbyte〔256〕;intlengetString(buf,buf。length);StringnormalCStringNative。toString(buf);StringembeddedNULsnewString(buf,0,len);
  可能有同学会问了,既然JAVA中的String可以转换成为char,为什么这里需要使用byte数组呢?
  这是因为getString方法需要对传入的char数组中的内容进行修改,但是因为String是不可变的,所以这里是不能直接使用String的,我们需要使用byte数组。
  接着我们使用Native。toString(byte〔〕)将byte数组转换成为JAVA字符串。
  再看一个返回值的情况:ExampleA:ReturnsaCstringdirectlyconstchargetString();ExampleB:ReturnsawidecharacterCstringdirectlyconstwchartgetString();
  一般情况下,如果是native方法直接返回string,我们可以使用String进行映射:MappingAStringgetString();MappingBWStringgetString();
  如果nativecode为String分配了内存空间,那么我们最好使用JNA中的Pointer作为返回值,这样我们可以在未来某些时候,释放所占用的空间,如下所示:PointergetString();Buffers,Memory,数组和Pointer
  什么时候需要用到Buffers和Memory呢?
  一般情况下如果是基础数据的数组作为参数传到函数中的话,可以在JAVA中直接使用基础类的数组来替代。但是如果native方法在方法返回之后,还需要访问数组的话(保存了指向数组的指针),这种情况下使用基础类的数组就不太合适了,这种情况下,我们需要用到ByteBuffers或者Memory。
  我们知道JAVA中的数组是带有长度的,但是对于native方法来说,返回的数组实际上是一个指向数组的指针,我们并不能知道返回数组的长度,所以如果native方法返回的是数组指针的话,JAVA代码中用数组来进行映射就是不合适的。这种情况下,需要用到Pointer。
  Pointer表示的是一个指针,先看一下Pointer的例子,首先是native代码:voidreturnPointerArgument(voidarg){returnarg;}voidreturnPointerArrayElement(voidargs〔〕,intwhich){returnargs〔which〕;}
  接下来是JAVA的映射:PointerreturnPointerArgument(Pointerp);PointerreturnPointerArrayElement(Pointer〔〕args,intwhich);
  除了基本的Pointer之外,你还可以自定义带类型的Pointer,也就是PointerType。只需要继承PointerType即可,如下所示:publicstaticclassTestPointerTypeextendsPointerType{publicTestPointerType(){}publicTestPointerType(Pointerp){super(p);}}TestPointerTypereturnPointerArrayElement(TestPointerType〔〕args,intwhich);
  再看一下字符串数组:charreturnStringArrayElement(charargs〔〕,intwhich){returnargs〔which〕;}wchartreturnWideStringArrayElement(wchartargs〔〕,intwhich){returnargs〔which〕;}
  对应的JAVA映射如下:StringreturnStringArrayElement(String〔〕args,intwhich);WStringreturnWideStringArrayElement(WString〔〕args,intwhich);
  对应Buffer来说,JAVANIO中提供了很多类型的buffer,比如ByteBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer和DoubleBuffer等。这里以ByteBuffer为例,来看一下具体的使用。
  首先看下native代码:int32tfillInt8Buffer(int8tbuf,intlen,charvalue){inti;for(i0;ilen;i){buf〔i〕value;}returnlen;}
  这里将buff进行填充,很明显后续还需要使用到这个buffer,所以这里使用数组是不合适的,我们可以选择使用ByteBuffer:intfillInt8Buffer(ByteBufferbuf,intlen,bytevalue);
  然后看下具体怎么使用:TestLibrarylibNative。load(testlib,TestLibrary。class);ByteBufferbufByteBuffer。allocate(1024)。order(ByteOrder。nativeOrder());finalbyteMAGIC(byte)0xED;lib。fillInt8Buffer(buf,1024,MAGIC);for(inti0;ibuf。capacity();i){assertEquals(Badvalueatindexi,MAGIC,buf。get(i));}可变参数
  对于native和JAVA本身来说,都是支持可变参数的,我们举个例子,在native方法中:int32taddVarArgs(constcharfmt,。。。){valistap;int32tsum0;vastart(ap,fmt);while(fmt){switch(fmt){cased:sumvaarg(ap,int32t);break;casel:sum(int)vaarg(ap,int64t);break;cases:short(promotedtointwhenpassedthrough。。。)casec:bytechar(promotedtointwhenpassedthrough。。。)sum(int)vaarg(ap,int);break;casef:float(promotedto‘double’whenpassedthrough‘。。。’)caseg:doublesum(int)vaarg(ap,double);break;default:break;}}vaend(ap);returnsum;}
  对应的JAVA方法映射如下:publicintaddVarArgs(Stringfmt,Number。。。args);
  相应的调用代码如下:intarg11;intarg22;assertEquals(32bitintegervarargsnotaddedcorrectly,arg1arg2,lib。addVarArgs(dd,arg1,arg2));总结
  本文介绍了在使用JNA方法映射中应该注意的一些细节和具体的使用问题。
  本文的代码:https:github。comddean2009learnjavabase9to20。git本文已收录于http:www。flydean。com05jnatypemappingdetailsmd
  最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
  欢迎关注我的公众号:程序那些事,懂技术,更懂你!

中国高级别自动驾驶正快速步入量产时代中新网北京5月21日电(记者闫晓虹)随着更为丰富的传感器装配,大算力计算平台逐步落地应用,高级别自动驾驶正快速步入量产时代。记者21日获悉,全球前沿的L4级自动驾驶通用解……自然中生活高中作文江南可采莲,莲叶何田田。是否你总幻想着乘一叶小楫轻舟,在半人高的荷叶中穿行。让双手优雅地抚过带着露珠的莲蓬,深吸一口,那股清香便已让你沉醉。明月松间照,清泉石上流。是否你……我的同学作文600字初一导语:岁月可以改变我们的容颜,无法改变我们的同学情。以下小编为大家介绍我的同学作文600字初一文章,欢迎大家阅读参考!我的同学作文600字初一1她是一个品学兼优的学生。但……祖国在我心中关于国庆的诗歌祖国啊祖国,我亲爱的祖国您是多么伟大您60岁生日即将来临我们怎么能不感到激动祖国无时无刻不在我心中60年的风雨铸就了祖国的繁荣昌盛时光……同学之间的小学生作文【篇一:同学之间】同学之间应该怎样才能处好关系?这一直困扰着我。但后来我从一件件小事之中发现了同学相处的奥秘。就在这个星期三,我们班发生了这样一件事:靠近谢凡旁边有……洗碗作文500字(精选15篇)在日常的学习、工作、生活中,大家都写过作文吧,作文根据写作时限的不同可以分为限时作文和非限时作文。你写作文时总是无从下笔?下面是小编为大家整理的洗碗作文500字(精选15篇),……教师节作文教师节作文心中的红烛教师节作文:教师节作文mdash;心中的ldquo;红烛rdquo;一串晶莹的泪珠从王老师的脸上滚下来,在厚厚的一沓试卷上溅起了一层蒙蒙的水花hellip;hellip;……幸福的瞬间幸福就是早上醒来,看到一抹阳光恰好落到枕边。可以不用急着起床,躲在被窝里听着妈妈在厨房里轻手轻脚的忙碌,不一会儿荷包蛋的香味弥漫了整个房间。幸福就是穿着白色的棉布长裙走在……作文雪美丽只是你的外表雪美丽只是你的外表雪花,轻飘飘地,慢慢地,似落叶飘落,落在那儿,雪白一片。若落在我心中,则是冰冷一片,可是,你从未落进我心中,你只是在那片土地中无尽的伦回,飘落后蒸发,再……八十天环游地球读后感《八十天环游地球》是一本世界名着,它主要讲述了一位非常守时的人,名叫斐利亚middot;福克,还有他的仆人,名叫路路通。他俩和福克先生的所有朋友打了个赌mdash;mdash;……从德国开到法国梅赛德斯电动汽车EQXX电池续航能力突破100今年一月,华尔街见闻文章提及,德国高端汽车制造商梅赛德斯宣布其VISIONEQXX原型汽车每次充电的续航里程将突破1000公里关口,当时《金融时报》引援公司的评价迄今为止最高效……新能源汽车成长的烦恼如何解【专家访谈】新能源汽车成长的烦恼如何解光明日报记者姚亚奇今年以来,新能源汽车呈高速增长态势。然而,新能源汽车发展中还面临一些成长的烦恼。哪些短板亟须补齐?如何……
关于小学生旅游的作文500字5篇在现实生活或工作学习中,大家都不可避免地要接触到作文吧,写作文是培养人们的观察力、联想力、想象力、思考力和记忆力的重要手段。你所见过的作文是什么样的呢?以下是小编精心整理的小学……高中雷锋就在我身边作文导语:做好事,有时也许只是一次很小的举动,也同样闪耀着人性的光辉。下面是小编整理的一些雷锋的作文,欢迎查阅,谢谢!【篇一:雷锋在我身边作文】就在50年前,一个名叫雷锋的年……关爱,就在身边700字清晨。雾,还弥漫在空气中,雨,还在ldquo;沙沙rdquo;地下着,我和妈妈一起耐心地等待着公交车的到来。过了一会儿,一辆绿色的公交车ldquo;呼啸而至rdquo;。……越博动力预计2019年一季度亏损1250。0万至1750。04月10日,越博动力(300742)发布业绩预告,公司预计2019年13月归属上市公司股东的净利润1750。00万至1250。00万,同比变动75。63至25。45,汽车零部件……修不了卖不掉,买一辆电动爹,第一批吃螃蟹的电动车车主哭诉5年前,新能源汽车开始得到推广,以电动汽车为首的新能源汽车成为汽车市场上的新秀。虽说当时消费者对电动汽车都很陌生,但是总要有第一个吃螃蟹的人,于是一小部分人成为了电动汽的车主,……比亚迪首款新能源跑车,2。9秒破百温馨提示:点击上方蓝字关注汽车行业关注,或者添加微信公众号:autoWechat,每日收获最新最快最热门的精彩汽车资讯。如果您有好的原创文章或者独家爆料,请发邮箱mailim4……保护环境作文500字今天,我放学回到家,拿起妈妈刚刚给我买的漫画书看了起来,突然一张图片吸引了我的眼球,让我陷入了沉思。漫画中的风景原本是很美好的,蔚蓝的天空,飘动的白云,绿绿的草地,还有茂……工信部发布第三批新能源汽车推广目录,3款燃料电池汽车入选4月9日,澎湃新闻记者获悉,工信部发布了《新能源汽车推广应用推荐车型目录(2019年第3批)》,共包括67家企业的178款车型,其中纯电动产品共64家企业164款型号、插电式混……花香沁人心初中作文600字花香沁人心初中作文600字篇一不经意间,在那一棵棵枝叶繁茂的桂花树丛中,冒出几朵浅黄色的小花,越来越多,像密密麻麻的天星。花香四溢,闻了让人心旷神怡。桂花不像梅花一……连云港两日游星期三的晚上,爸爸兴高采烈地对我说:ldquo;明天咱们家要去连云港,简称连港,原来爸爸每次去哪一个景点的时候都要查资料,就像连云港的海拔是624。9千米,乘车需六小时等等。……最遥远的距离地球上最遥远的距离,是从珠穆朗玛峰顶到马里亚纳海沟底;人心间的距离则远不止此。有时正如人们常说的:一念之差,决定地狱还是天堂。仇恨,这一粒小小的黑色种子,是人与人之间最遥……骄傲的作文300字导语:我们很多的时候都会写骄傲的作文,但骄傲的作文怎么写呢?以下是小编整理的资料,欢迎阅读参考。骄傲的作文500字1提起一件值得我骄傲的事,那就是我写的作文在网上投稿后并……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网