这篇文章主要讲解了“JNA中的Memory和Pointer怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JNA中的Memory和Pointer怎么使用”吧!我们知道在native的代码中有很多指针,这些指针在JNA中被映射成为Pointer。Pointer是JNA中引入的类,用来表示native方法中的指针。大家回想一下native方法中的指针到底是什么呢?native方法中的指针实际上就是一个地址,这个地址就是真正对象的内存地址。所以在Pointer中定义了一个peer属性,用来存储真正对象的内存地址:实时上,Pointer的构造函数就需要传入这个peer参数:接下来我们看一下如何从Pointer中取出一个真正的对象,这里以byte数组为例:实际上这个方法调用了Native.read方法,我们继续看一下这个read方法:可以看到它是一个真正的native方法,用来读取一个指针对象。除了Byte数组之外,Pointer还提供了很多其他类型的读取方法。又读取就有写入,我们再看下Pointer是怎么写入数据的:同样的,还是调用 Native.write
方法来写入数据。这里Native.write方法也是一个native方法:Pointer还提供了很多其他类型数据的写入方法。当然还有更加直接的get*方法:在Pointer中,还有两个createConstant方法,用来创建不可读也不可写的Pointer:实际上返回的而是Opaque类,这个类免费云主机域名继承自Pointer,但是它里面的所有read或者write方法,都会抛出UnsupportedOperationException
:Pointer是基本的指针映射,如果对于通过使用native的malloc方法分配的内存空间而言,除了Pointer指针的开始位置之外,我们还需要知道分配的空间大小。所以一个简单的Pointer是不够用了。这种情况下,我们就需要使用Memory。Memory是一种特殊的Pointer, 它保存了分配出来的空间大小。我们来看一下Memory的定义和它里面包含的属性:Memory里面定义了5个数据,我们接下来一一进行介绍。首先是最为重要的size,size表示的是Memory中内存空间的大小,我们来看下Memory的构造函数:可以看到Memory类型的数据需要传入一个size参数,表示Memory占用的空间大小。当然,这个size必须要大于0.然后调用native方法的malloc方法来分配一个内存空间,返回的peer保存的是内存空间的开始地址。如果peer==0,表示分配失败。如果分配成功,则将当前Memory保存到LinkedReference中,用来跟踪当前的位置。我们可以看到Memory中有两个LinkedReference,一个是HEAD,一个是reference。LinkedReference
本身是一个WeakReference
,weekReference引用的对象只要垃圾回收执行,就会被回收,而不管是否内存不足。我们看一下LinkedReference的构造函数:这个QUEUE是ReferenceQueue,表示的是GC待回收的对象列表。我们看到Memory的构造函数除了设置size之外,还调用了:仔细看LinkedReference.track方法:这个方法的意思是首先从QUEUE中拿出那些准备被垃圾回收的Memory对象,然后将其从LinkedReference中unlink。 最后将新创建的对象加入到LinkedReference中。因为Memory中的QUEUE和HEAD都是类变量,所以这个LinkedReference
保存的是JVM中所有的Memory对象。最后Memory中也提供了对应的read和write方法,但是Memory中的方法和Pointer不同,Memory中的方法多了一个boundsCheck,如下所示:为什么会有boundsCheck呢?这是因为Memory和Pointer不同,Memory中有一个size的属性,用来存储分配的内存大小。使用boundsCheck就是来判断访问的地址是否出界,用来保证程序的安全。感谢各位的阅读,以上就是“JNA中的Memory和Pointer怎么使用”的内容了,经过本文的学习后,相信大家对JNA中的Memory和Pointer怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是百云主机,小编将为大家推送更多相关知识点的文章,欢迎关注!
这篇文章主要讲解了“Rust字符串字面值实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Rust字符串字面值实例分析”吧!Rust 中有两种字符串,String 和 &str,其中 String …
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。