2013-04-19 2 views

답변

2

프로세스는 다음 단계 ashmem 새로운 영역을 생성한다

(1) 디바이스 파일, "/ 디바이스/ashmem"을 열고 파일 디스크립터를 얻는다. (2) ashmem 이름을 설정하려면 ASHMEM_SET_NAME ioctl을 호출하십시오. 가상 장치 파일 인 것처럼 보입니다. 따라서 이름을 "my_mem"으로하면 파일 이름은 "/ dev/ashmem/my_mem"으로 바뀝니다. (3) ashmem 크기를 바이트 단위로 설정하려면 ASHMEM_SET_SIZE ioctl을 호출하십시오.

int fd = ashmem_create_region("my_mem", PAGE_SIZE * 20); 

파일 기술자는 다른 프로세스와 공유 할 수 있습니다 :

cutils 라이브러리는 하나의 함수 호출로 다음 단계를 래핑하는 기능 "ashmem_create_region"을 가지고있다. Android는 "바인더"라는 다른 서비스를 사용하여 사촌 프로세스간에 파일 설명자를 공유하는 특별한 방법을 제공합니다. 짜잔,

char *map = mmap(NULL, PAGE_SIZE * 20, PROT_READ|PROT_WRITE, 
             MAP_SHARED, fd, 0); 

과 : 그런 다음 각 프로세스는 파일을 mmaps! 즉석 공유 메모리.

+0

Android x86에서도이 작업을 수행 할 수 있습니까? –

+0

물론, 그렇습니다. –

+0

저는 다시 사람이되었습니다 ... AOSP를 사용하여 Android에서 기본적으로 실행할 수있는 "Hello World"C 프로그램을 만들었습니다. 나는 그 "Hello World"프로그램에 ashmem 기능을 갖기를 원했다. 가능한가? –

0

Android에서 바인더 IPC를 사용하십시오. 나는 바인더가 인터 프로세스 통신을 위해 모든 프로세스에서 공유되는 커널 메모리를 사용한다고 생각한다.

3

다음은 나를 위해 일한 것입니다.
1) MemoryFile 개체를 엽니 다. mFile;
2) mmap을 사용하여 ashem에 매핑하는 서비스를 생성하십시오.
3) ParcelFileDescriptor pfd를 사용하여 서비스에 바인드하는 클라이언트에 네이티브 파일 설명자 (fd)를 반환합니다.
4) fd를 취하여 mmap을 사용하여 재에 매핑하는 클라이언트의 JNI를 생성합니다.
5)이 fd를 사용하여 InputStream을 생성하면 이제 클라이언트는 InputStream 객체를 사용하여 동일한 메모리 영역을 읽고 쓸 수 있습니다.
link은 MemoryFile을 (으)로 매핑하는 방법을 보여줍니다. 이 link은 AIDL 및 ParcelFileDescriptor를 통해 클라이언트에 원시 파일 설명자 (fd)를 보내는 방법을 보여줍니다. 서버 측에

, 당신은 작성해야합니다
1) 된 ParcelFileDescriptor를 통해 클라이언트에 기본 FD를 전달하는 서비스 & AIDL; 2) 매핑을 수행하는 서비스 측의 JNI.

클라이언트에서 : 1) 서비스에 바인딩 한 다음 서비스를 호출하여 원시 fd를 가져 오는 방법. 2) fd를 ashem에 매핑하는 JNI.

매핑 된 메모리 영역은 서비스 & 클라이언트에 의해 읽고 쓸 수 있습니다.

0

글쎄, 당신이 공유 메모리 API를 사용하려는 경우가 여기에 마법 같은 솔루션 https://github.com/pelya/android-shmem

, 그것은 완벽하게 작동합니다. shmget(), shmat() 및 shmdt() API를 사용하여 독립적 인 프로세스에서 안드로이드의 공유 메모리를 사용할 수 있습니다. 시도 해봐.

관련 문제