繁体   English   中英

MemoryFile在android中的用途是什么?

[英]what is the use of MemoryFile in android

我想写一些字节到共享内存。 这是在我的application1中完成的。 从我的另一个应用程序:application2我想访问该共享内存来读取写入的字节。 为此,我尝试使用android的MemoryFile类。 我被困在如何在两个不同的应用程序之间引用相同的分片内存。 如果memoryFile用于相同的目的,我现在也很困惑。 http://developer.android.com/reference/android/os/MemoryFile.html我发现这个主题的链接。 提前致谢。 克里希纳

method: 如果你想在MemoryFile中使用一些跨进程,你可以使用以下方法:

import android.os.MemoryFile;
import android.os.ParcelFileDescriptor;

import java.io.FileDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MemoryFileUtil {
    private static final Method sMethodGetParcelFileDescriptor;
    private static final Method sMethodGetFileDescriptor;
    static {
        sMethodGetParcelFileDescriptor = get("getParcelFileDescriptor");
        sMethodGetFileDescriptor = get("getFileDescriptor");
    }

    public static ParcelFileDescriptor getParcelFileDescriptor(MemoryFile file) {
        try {
            return (ParcelFileDescriptor) sMethodGetParcelFileDescriptor.invoke(file);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        }
    }

    public static FileDescriptor getFileDescriptor(MemoryFile file) {
        try {
            return (FileDescriptor) sMethodGetFileDescriptor.invoke(file);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        }
    }

    private static Method get(String name) {
        try {
            return MemoryFile.class.getDeclaredMethod(name);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        }
    }
}

您应该看到的是#getParcelFileDescriptor(MemoryFile)方法,您可以从ContentProvider#openFile(Uri, String) #getParcelFileDescriptor(MemoryFile) ContentProvider#openFile(Uri, String)的实现返回该方法。

我怀疑内存文件没有getParcelFileDescriptor方法。 当我评论这个getParcelFileDescriptor相关方法并使用getFileDescriptor时。 它工作得很好。

import java.io.FileDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import android.os.MemoryFile;

/**
 * Invoke hidden methods using reflection
 * 
 */
public class MemoryFileUtil {
    private static final Method sMethodGetFileDescriptor;
    static {
        sMethodGetFileDescriptor = get("getFileDescriptor");
    }

    public static FileDescriptor getFileDescriptor(MemoryFile file) {
        try {
            return (FileDescriptor) sMethodGetFileDescriptor.invoke(file);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        }
    }

    private static Method get(String name) {
        try {
            return MemoryFile.class.getDeclaredMethod(name);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        }
    }
}

并从内存文件中创建了文件描述符。

FileDescriptor fd = MemoryFileUtil.getFileDescriptor(memFile);

MemoryFile可用于映射到物理内存。 结果文件描述符(fd)可以传递给客户端(内存共享端)。 客户端可以将相同的本机fd映射到相同的内存区域。 然后可以使用本机fd共享内存,可以使用InputStream将其映射到java层。

有关详细信息,请参阅此链接:
使用ashem共享内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM