Android

돌고래 2015. 5. 14. 21:43

http://www.androidenea.com/2010/03/share-memory-using-ashmem-and-binder-in.html

http://m.blog.naver.com/xicnt/10152627786


안드로이드 shared memory ASHMEM VS PMEM


ASHMEM : 

1) virtual memory 사용

2) 사용이 끝나면 그 메모리를 참조하던 모든 fd들은 close


PMEM : 

1) 인접한 물리 메모리 사용

2) 직접 메모리를 해제해 주어야 한다.



C++에서 ASHMEM 사용

fd = ashmem_create_region("my_shm_region", size);

if(fd < 0)

return -1;

data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

if(data == MAP_FAILED)

goto out;



안드로이드 java에서 ASHMEM

android.os.MemoryFile



android.os.MemoryFile example

http://www.codota.com/android/scenarios/52fcbca7da0a12229fc989a3/android.os.MemoryFile?tag=dragonfly



java int <--->  byte 변환

http://dev.re.kr/24


[Java] String -> byte, byte -> String 변환

http://roadrunner.tistory.com/139



[java] byte 배열 <---> 자료형 변환


import android.support.v7.app.ActionBarActivity;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

import java.io.IOException;


import android.os.MemoryFile;

import android.util.Log;


public class MainActivity extends ActionBarActivity {


public  byte[] intToByteArray(int value) 

{

byte[] byteArray = new byte[4];

byteArray[0] = (byte)(value >> 24);

byteArray[1] = (byte)(value >> 16);

byteArray[2] = (byte)(value >> 8);

byteArray[3] = (byte)(value);

return byteArray;

}

public  int byteArrayToInt(byte bytes[], int n) 

{

return ((((int)bytes[n + 0] & 0xff) << 24) |

(((int)bytes[n + 1] & 0xff) << 16) |

(((int)bytes[n + 2] & 0xff) << 8) |

(((int)bytes[n + 3] & 0xff)));

}

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        

try 

{

byte [] byteArray = new byte[1024*4];

MemoryFile mf = new MemoryFile("mmfdemo", 1024*4);

//Log.i("AndroidIPC::SHM", "IPC.setMemoryFile " + ipcStatus);

for(int n = 0; n < 1024; ++n)

{

byteArray[n*4 + 0] = (byte)(n >> 24);

byteArray[n*4 + 1] = (byte)(n >> 16);

byteArray[n*4 + 2] = (byte)(n >> 8);

byteArray[n*4 + 3] = (byte)(n);

}

mf.writeBytes(byteArray, 0, 0, byteArray.length);

byte [] readArray = new byte[1024*4];

mf.readBytes(readArray, 0, 0, readArray.length);

for(int n = 0; n < 1024; ++n)

{

int num = byteArrayToInt( readArray, 4*n);

Log.i("MMF", "MMF: " + n);

}

Log.i("MMF", "MMF: test");

mf.close();

catch (IOException e) 

{

e.printStackTrace();

}        

    }



비밀댓글입니다