前面分析了Ashmem的C++访问接口层,在本节开始分析其Java访问接口层的实现过程。在Android应用程序框架层中,通过使用接口MemoryFile来封装匿名共享内存文件的创建和使用。接口MemoryFile在文件frameworks/base/core/java/android/os/MemoryFile.java中定义,具体实现代码如下。
在上述代码中,构造方法MemoryFile以指定的字符串调用了JNI方法native_open,目的是建立一个Ashmem文件,这样可以得到一个文件描述符。然后使用这个文件描述符为参数调用JNI方法natvie_mmap,并把Ashmem文件映射到进程空间中,这样就可以通过映射得到地址空间的方式直接访问内存数据。
再看JNI函数android_os_MemoryFile_get_size,此函数在文件frameworks\base\core\jni\android_os_MemoryFile.cpp中定义,具体实现代码如下。
再看JNI函数android_os_MemoryFile_open,此函数在文件frameworks\base\core\jni\android_os_MemoryFile.cpp中定义,具体实现代码如下。
再看JNI函数android_os_MemoryFile_mmap,此函数在文件frameworks\base\core\jni\android_os_MemoryFile.cpp中定义,具体实现代码如下。(www.daowen.com)
在文件frameworks/base/core/java/android/os/MemoryFile.java中,再看类MemoryFile的成员函数readBytes,功能是读取某一块Ashmem的内容。具体实现代码如下。
在文件frameworks/base/core/java/android/os/MemoryFile.java中,再看类MemoryFile的成员函数writeBytes,功能是写入某一块Ashmem的内容。具体实现代码如下。
在文件frameworks/base/core/java/android/os/MemoryFile.java中,再看类MemoryFile的成员函数isDeactivated,功能是保证Ashmem已经被映射到进程的地址空间中。具体实现代码如下。
JNI函数native_read和native_write分别由位于C++层的函数android_os_MemoryFile_read和android_os_MemoryFile_write实现,这两个C++的函数在文件frameworks\base\core\jni\android_os_MemoryFile.cpp中定义,具体实现代码如下。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。