簡體   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