package wzr.com.slidefinish.util;
import android.os.MemoryFile;
import android.os.ParcelFileDescriptor;
import java.io.FileDescriptor;
import java.io.IOException;
import java.lang.reflect.Method;
/**
• 对memoryFile类的扩展
• 1.从memoryFile对象中获取FileDescriptor,ParcelFileDescriptor
• 2.根据一个FileDescriptor和文件length实例化memoryFile对象
*/
public class MemoryFileHelper {
/**
• 创建共享内存对象
• @param name 描述共享内存文件名称
• @param length 用于指定创建多大的共享内存对象
• @return MemoryFile 描述共享内存对象
*/
public static MemoryFile createMemoryFile(String name,int length){
try {
return new MemoryFile(name,length);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static MemoryFile openMemoryFile(ParcelFileDescriptor pfd,int length,int mode){
if(pfd == null){
throw new IllegalArgumentException(“ParcelFileDescriptor 不能为空”);
}
FileDescriptor fd = pfd.getFileDescriptor();
return openMemoryFile(fd,length,mode);
}
/**
  • 打开共享内存,一般是一个地方创建了一块共享内存
  • 另一个地方持有描述这块共享内存的文件描述符,调用
  • 此方法即可获得一个描述那块共享内存的MemoryFile
  • 对象
  • @param fd 文件描述
  • @param length 共享内存的大小
  • @param mode PROT_READ = 0x1只读方式打开,
PROT_WRITE = 0x2可写方式打开,
PROT_WRITE|PROT_READ可读可写方式打开
    • @return MemoryFile
    */
    public static MemoryFile openMemoryFile(FileDescriptor fd,int length,int mode){
    MemoryFile memoryFile = null;
    try {
    memoryFile = new MemoryFile(“tem”,1);
    memoryFile.close();
    Class<?> c = MemoryFile.class;
    Method native_mmap = null;
    Method[] ms = c.getDeclaredMethods();
    for(int i = 0;ms != null&&i<ms.length;i++){
    if(ms[i].getName().equals(“native_mmap”)){
    native_mmap = ms[i];
    }
    }
    ReflectUtil.setField(“android.os.MemoryFile”, memoryFile, “mFD”, fd);
    ReflectUtil.setField(“android.os.MemoryFile”,memoryFile,“mLength”,length);
    long address = (long) ReflectUtil.invokeMethod( null, native_mmap, fd, length, mode);
    ReflectUtil.setField(“android.os.MemoryFile”, memoryFile, “mAddress”, address);
    } catch (Exception e) {
    e.printStackTrace();
    }
    return memoryFile;
    }
    /**
    • 获取memoryFile的ParcelFileDescriptor
    • @param memoryFile 描述一块共享内存
    • @return ParcelFileDescriptor
    */
    public static ParcelFileDescriptor getParcelFileDescriptor(MemoryFile memoryFile){
    if(memoryFile == null){
    throw new IllegalArgumentException(“memoryFile 不能为空”);
    }
    ParcelFileDescriptor pfd;
    FileDescriptor fd = getFileDescriptor(memoryFile);
    pfd = (ParcelFileDescriptor) ReflectUtil.getInstance(“android.os.ParcelFileDescriptor”,fd);
    return pfd;
    }
    /**
    • 获取memoryFile的FileDescriptor
    • @param memoryFile 描述一块共享内存
    • @return 这块共享内存对应的文件描述符
    */
    public static FileDescriptor getFileDescriptor(MemoryFile memoryFile){
    if(memoryFile == null){
    throw new IllegalArgumentException(“memoryFile 不能为空”);
    }
    FileDescriptor fd;
    fd = (FileDescriptor) ReflectUtil.invoke(“android.os.MemoryFile”,memoryFile,“getFileDescriptor”);
    return fd;
    }
    }
    ReflectUtil.java
    package wzr.com.slidefinish.util;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    /**
    • 反射工具类
    • Created by wuzr on 2016/6/27.
    */
    public class ReflectUtil {
    /**
    *根据类名,参数实例化对象
    • @param className 类的路径全名
    • @param params 构造函数需要的参数
    • @return 返回T类型的一个对象
    */
    public static Object getInstance(String className,Object … params){
    if(className == null || className.equals(“”)){
    throw new IllegalArgumentException(“className 不能为空”);
    }
    try {
    Class<?> c = Class.forName(className);
    if(params != null){
    int plength = params.length;
    Class[] paramsTypes = new Class[plength];
    for (int i = 0; i < plength; i++) {
    paramsTypes[i] = params[i].getClass();
    }
    Constructor constructor = c.getDeclaredConstructor(paramsTypes);
    constructor.setAccessible(true);
    return constructor.newInstance(params);
    }
    Constructor constructor = c.getDeclaredConstructor();
    constructor.setAccessible(true);
    return constructor.newInstance();
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }
    /**
    • 执行instance的方法
    • @param className 类的全名
    • @param instance 对应的对象,为null时执行类的静态方法
    • @param methodName 方法名称
    • @param params 参数
    */
    public static Object invoke(String className,Object instance,String methodName,Object … params){
    if(className == null || className.equals(“”)){
    throw new IllegalArgumentException(“className 不能为空”);
    }
    if(methodName == null || methodName.equals(“”)){
    throw new IllegalArgumentException(“methodName不能为空”);
    }
    try {
    Class<?> c = Class.forName(className);
    if(params != null){
    int plength = params.length;
    Class[] paramsTypes = new Class[plength];
    for(int i = 0;i < plength;i++){
    paramsTypes[i] = params[i].getClass();
    }
    Method method = c.getDeclaredMethod(methodName, paramsTypes);
    method.setAccessible(true);
    return method.invoke(instance, params);
    }
    Method method = c.getDeclaredMethod(methodName);
    method.setAccessible(true);
    return method.invoke(instance);
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }
    /**
    • 执行指定的对方法
    • @param instance 需要执行该方法的对象,为空时,执行静态方法
    • @param m 需要执行的方法对象
    • @param params 方法对应的参数
    • @return 方法m执行的返回值
    */
    public static Object invokeMethod(Object instance,Method m,Object … params){
    if(m == null){
    throw new IllegalArgumentException(“method 不能为空”);
    }
    m.setAccessible(true);
    try {
    return m.invoke(instance,params);
    } catch (Exception e){
    e.printStackTrace();
    }
    return null;
    }
    /**