�@����̃e�[�}�́uAndroid��JNI�iJava Native Interface�j���g�p�����A�v���̍������v�ł��BC/C++��OpenGL ES�i���j�Ƃ������l�C�e�B�u�R�[�h���g���c�[���Ȃǂ̃Z�b�g�́AAndroid NDK�iNative Development Kit�j�Ƃ��Ē���Ă��āAJNI���g�p�����������Ɍ������܂���B
�@JNI��NDK�̏ڍׂ́A�ȉ��̋L�������m�F���������B
�@�����Android NDK�ł����A����A�ŐV�ł�Revision 3�������[�X����AOpenGL ES 2.0���T�|�[�g�����悤�ɂȂ�A����ɃO���t�B�b�N�`��@�\����������܂����B
�@���Ȃ݂ɁAr3�iRevision 3�j�����[�X�ɔ����A���܂܂ł�NDK�̃o�[�W�����AAndroid 1.6 NDK Release 1�i1.6r1�j��Android NDK r2�iRevision 2�j�ɁA1.5 NDK Release 1�i1.5r1�j�͓�����r1�iRevision 1�j�ɌĂѕ����ς���Ă���̂ŁA�����ӂ��������B
�@����̑�ނƂ��āA�O��́uAndroid 2.1�̐V�@�\�uLive Wallpaper�v�ō��A�������R����g�҂��h�v�̃T���v�����g�p���āA�R����G�t�F�N�g�����������܂��B���L�̓���ō���������Ă��邱�Ƃ��m�F�ł��܂��ˁB
�ŏ��́AJNI�����ŁA����Java�łɐ�ւ��āA�ēxJNI�����łɖ߂�������T���v��
�@����̍��������{�����T���v���A�v���́A�ȉ����_�E�����[�h���Ă��������B
�@Web�A�v���P�[�V�������J������Java�v���O���}�ɂƂ��āAJNI�͂��܂�g�p���Ȃ��@�\�ł͂Ȃ����Ǝv���܂��B����Java�Ƃ������ꂨ��ю��s���͂ƂĂ��D�G�Ȃ̂ŁAJava�����Ŏ�����Ă��܂����߂ł��B
�@����́A�ړI��������JNI���g�p����̂ł����A���̑O��Android��JNI���g�p���郁���b�g�ƃf�����b�g�����Ă݂܂��傤�B
�����b�g | �f�����b�g |
---|---|
�����̃��C�u�����̊��p | �v���b�g�t�H�[���Ɉˑ� |
�p�t�H�[�}���X���� | �������Ǘ��Ȃǂ��ʓ| |
�\1�@JNI�̃����b�g�ƃf�����b�g |
�@�����b�g��C/C++�ȂǂŎ������ꂽ�����̃��C�u�����𗘗p�ł��邱�ƁA�p�t�H�[�}���X������ł��邱�Ƃł��BAndroid 2.1��Dalvik VM�ɂ́AJIT�͓��ڂ���Ă��Ȃ����߁A�p�t�H�[�}���X����͌����ł��B�f�����b�g�̓v���b�g�t�H�[���iCPU�̃A�[�L�e�N�`���j�Ɉˑ����Ă��܂����Ƃ��������܂��B
�@�����_��Android�̃v���b�g�t�H�[���̂قƂ�ǂ�ARM�A�[�L�e�N�`�����̗p���Ă��܂����Ax86���͂��߁A���܂��܂�CPU�̃v���b�g�t�H�[�����T�|�[�g����n�߂Ă��܂��B
�@����̃T���v���́AARM�����̃l�C�e�B�u���C�u�������A�v���ɑg�ݍ��܂ꂽ�`�ɂȂ��Ă��܂��B���̃l�C�e�B�u���C�u������ARM�A�[�L�e�N�`���ȊO�œ���ł��Ȃ��̂ŁA�K�v�ł���uSystem.getProperty("os.arch")�v�Ŏ擾�����l�Ɂuarm�v�܂��́uARM�v���܂܂�Ă��邩�ǂ����Ŕ��f���܂��B�܂܂�Ă��Ȃ��ꍇ�́A�l�C�e�B�u���C�u���������[�h�����A��֎�i���u����̂������ł��傤�B
JNI�̎�����C/C++���g�p���邱�ƂɂȂ�̂ł����AC/C++���g�p����ɓ�����A���Ȃ̂��������Ǘ��ł��B�ȉ��ɁAJNI�ɂ����郁�����Ǘ��̐헪���Љ�܂��B
�EJNI_OnLoad()�AJNI_OnUnload()
JNI_OnLoad()�́A�l�C�e�B�u���C�u���������[�h���ꂽ�ۂɌĂяo�������ŁAJNI_OnUnload()���̓l�C�e�B�u���C�u�������܂ރN���X���[�_���K�x�[�W�R���N�^�ʼn�������ۂɌĂяo����܂��B�l�C�e�B�u���C�u�����Ŋm�ۂ����������́AJNI_OnUnload()���ʼn��������@���l�����܂��B�l�C�e�B�u���̍�Ɨ̈��V�X�e���ŋ��L�\�ȃ������Ȃǂ̉���Ɍ����Ă��܂��B
�EObject#finalize()
�l�C�e�B�u���Ŋm�ۂ����������́A���̃A�h���X��Java���̃t�B�[���h��int�Ƃ��ĕێ����Ă����A�Ώۂ̃C���X�^���X���K�x�[�W�R���N�^�ʼn�������ۂɁAfinalize()���\�b�h�ʼn��������@���l�����܂��B�l�C�e�B�u���̏�����Java�̃C���X�^���X�ɘA������ꍇ�Ɍ����Ă��܂��B
�ǂ���̃P�[�X�ɂ��Ă��A�������ȊO�Ƀ��\�[�X�̉�����K�v�ł��B���\�[�X�̉���ƃ������̉���́A�K�v�ƂȂ�^�C�~���O���قȂ�ꍇ������̂ŁA���ӂ��Ă��������B
�@����̖ړI�́AJNI���g�p�����������ł��B�ł�����A�܂��ǂ̕����̏������d���̂��������܂��B
public void draw(Canvas canvas){ synchronized (this) { Log.d("TIME", "1:" + System.currentTimeMillis()); for (int i = 0; i < width * height; i++) { if (seedparam[i]!= 0 && seedparam[i] > (int)((fireLevel - boost) * Math.random())) { pallet[i] = 127; } else if (seedparam[i] != 0) { pallet[i] = 0; } } if (boost > 0) { boost--; } Log.d("TIME", "2:" + System.currentTimeMillis()); for (int i = 1; i < height - 1; i++) { for (int j = 1; j < width - 1; j++) { pallet[(i - 1) * width + j] = (pallet[i * width + j] + pallet[i * width + j - 1] + pallet[i * width + j + 1] + pallet[(i - 1) * width + j] + pallet[(i + 1) * width + j]) / 5; } } Log.d("TIME", "3:" + System.currentTimeMillis()); for (int i = 0; i < width * height; i++) { image[i] = color[pallet[i]]; } Log.d("TIME", "4:" + System.currentTimeMillis()); bitmap.setPixels(image, 0, width, 0, 0, width, height); Log.d("TIME", "5:" + System.currentTimeMillis()); canvas.drawBitmap(bitmap, 0, 0, null); Log.d("TIME", "6:" + System.currentTimeMillis()); } }
�@��L�͑O��̃T���v���̏�Ԃ̃\�[�X�R�[�h�ŁA�Ƃ���ǂ���Ƀ��O�����ߍ���ł���܂��B�M�҂̊��ł̃G�~�����[�^��ł̏��v���Ԃ͈ȉ��̒ʂ�ł��B
�敪 | �����T�v | �o�ߎ��� |
---|---|---|
1�`2 | �e�s�N�Z���̃p���b�g�������� | 331ms |
2�`3 | �e�s�N�Z���̃p���b�g���Čv�Z | 1224ms |
3�`4 | �e�s�N�Z���F���p���b�g����I�� | 219ms |
4�`5 | �r�b�g�}�b�v�Ƀs�N�Z���f�[�^��ݒ� | 40ms |
5�`6 | �r�b�g�}�b�v��`�� | 6ms |
�\2�@�M�҂̊��ł̃G�~�����[�^��ł̏��v���� |
�@for���[�v�����Ńs�N�Z���������s���Ă���������|�I�ɒx���ł��B�������o���ăl�C�e�B�u������A�������������߂����ł��B
public void draw(Canvas canvas) { synchronized (this) { effect(fireLevel, width, height, image, pallet, seedparam, color); bitmap.setPixels(image, 0, width, 0, 0, width, height); canvas.drawBitmap(bitmap, 0, 0, null); } }
private native void effect(int fireLevel, int width, int height, int[] image, int[] pallet, int[] seedparam, int[] color);
�@�V�����\�[�X�R�[�h�́A��L�̂悤�ɁA�������Ԃ̂����镔�������ׂăl�C�e�B�u�R�[�h�ɒu�������Ă��܂��BJava�݂̂ŕ���1300ms�������Ă����`�揈�����AJNI�ɒu�������邱�Ƃŕ���70ms�ɂȂ�܂����B
�敪 | �����T�v | �o�ߎ��� |
---|---|---|
Native | �s�N�Z������ | 30ms |
Java | �r�b�g�}�b�v���� | 40ms |
�\3�@���v���Ԃ̔�r |
�@Java�̏������l�C�e�B�u�ɈڐA���邱�Ƃō������ł���A�Ƃ�����ϗǂ���ɂȂ������Ǝv���܂��B
�@����ł́A���y�[�W���JNI�ւ̒u���������@���ڂ������Ă����܂��傤�B
Copyright © ITmedia, Inc. All Rights Reserved.