<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF157%3AARM_%D0%B8_Android%3A%D0%9F%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5</id>
		<title>LXF157:ARM и Android:Про­грам­ми­ро­ва­ние - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF157%3AARM_%D0%B8_Android%3A%D0%9F%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF157:ARM_%D0%B8_Android:%D0%9F%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;action=history"/>
		<updated>2026-05-14T12:13:59Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF157:ARM_%D0%B8_Android:%D0%9F%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=17273&amp;oldid=prev</id>
		<title>Olkol: /* Ра­бо­та с гра­фи­кой с по­мо­щью SDL */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF157:ARM_%D0%B8_Android:%D0%9F%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=17273&amp;oldid=prev"/>
				<updated>2018-07-22T04:08:33Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Ра­бо­та с гра­фи­кой с по­мо­щью SDL&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 04:08, 22 июля 2018&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 193:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 193:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;И по­лу­ча­ем файл APK, ко­то­рый мож­но уста­но­вить на уст­рой­ст­во Android так же, как и лю­бое дру­гое при­ло­жение.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;И по­лу­ча­ем файл APK, ко­то­рый мож­но уста­но­вить на уст­рой­ст­во Android так же, как и лю­бое дру­гое при­ло­жение.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;На­пи­сание про­грамм для Android на C тре­бу­ет­ся не толь­ко ха­ке­рам и тем, кто хо­чет пе­ренести на мо­биль­ную плат­фор­му на­пи­сан­ный ранее код. Толь­ко ис­поль­зуя C и C++, мы мо­жем сде­лать то, что час­то тре­бу­ет­ся в вы­со­ко­про­из­во­ди­тель­ных про­грам­мах: об­ра­тить­ся на­пря­мую к воз­мож­но­стям про­цес­со­ра ARM. Об этом – в сле­дую­щей час­ти. &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;|&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;На­пи­сание про­грамм для Android на C тре­бу­ет­ся не толь­ко ха­ке­рам и тем, кто хо­чет пе­ренести на мо­биль­ную плат­фор­му на­пи­сан­ный ранее код. Толь­ко ис­поль­зуя C и C++, мы мо­жем сде­лать то, что час­то тре­бу­ет­ся в вы­со­ко­про­из­во­ди­тель­ных про­грам­мах: об­ра­тить­ся на­пря­мую к воз­мож­но­стям про­цес­со­ра ARM. Об этом – в сле­дую­щей час­ти.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF157:ARM_%D0%B8_Android:%D0%9F%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=17272&amp;oldid=prev</id>
		<title>Olkol: /* Ра­бо­та с гра­фи­кой с по­мо­щью SDL */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF157:ARM_%D0%B8_Android:%D0%9F%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=17272&amp;oldid=prev"/>
				<updated>2018-07-22T03:49:29Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Ра­бо­та с гра­фи­кой с по­мо­щью SDL&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 03:49, 22 июля 2018&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 102:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 102:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;==Ра­бо­та с гра­фи­кой с по­мо­щью SDL==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;==Ра­бо­та с гра­фи­кой с по­мо­щью SDL==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Как мы уже ви­де­ли, на­шим про­грам­мам доступ­ны все сред­ст­ва вы­во­да гра­фи­ки Android, на­чи­ная с OpenGL ES и за­кан­чи­вая ви­део­бу­фе­ром. Ос­та­лось толь­ко встро­ить гра­фи­че­­ский вы­вод на­ше­го при­ло­жения в об­щую ме­ханику ра­бо­ты опе­ра­ци­он­ной сис­те­мы. Са­мый про­стой спо­соб сде­лать это – на­пи­сать оберт­ку на Java, ко­то­рая бу­дет вы­зы­вать по­лез­ный код на­шей про­грам­мы с по­мо­щью JNI. По­сколь­ку од­на из за­дач, ко­то­рую мы ста­вим пе­ред со­бой, за­клю­ча­ет­ся в уп­ро­щении пе­ре­но­са на Android про­грамм, пред­на­зна­чен­ных для на­столь­ных вер­сий Linux, возника­ет во­прос, на­сколь­ко дол­жен из­менить­ся код про­грам­мы, на­пи­сан­ной на C или C++. От­вет на этот во­прос за­ви­сит от то­го, на­сколь­ко пе­ре­но­си­мая про­грам­ма по сво­ему по­ве­дению долж­на быть по­хо­жа на стан­дарт­ное при­ло­жение Android. &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;В са­мом про­стом слу­чае код про­грам­мы, на­пи­сан­ной на C или C++, не при­дет­ся ме­нять во­об­ще. Но по­лу­чен­ная в ре­зуль­та­те про­грам­ма бу­дет вес­ти се­бя не со­всем так, как обыч­ные при­ло­жения Android. Бо­лее глу­бо­кая «ан­д­рои­ди­за­ция» про­грамм по­тре­бу­ет внесения из­менений в их ар­хи­тек­ту­ру в со­от­вет­ст­вии с тре­бо­вания­ми ОС Android.&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Как мы уже ви­де­ли, на­шим про­грам­мам доступ­ны все сред­ст­ва вы­во­да гра­фи­ки Android, на­чи­ная с OpenGL ES и за­кан­чи­вая ви­део­бу­фе­ром. Ос­та­лось толь­ко встро­ить гра­фи­че­­ский вы­вод на­ше­го при­ло­жения в об­щую ме­ханику ра­бо­ты опе­ра­ци­он­ной сис­те­мы. Са­мый про­стой спо­соб сде­лать это – на­пи­сать оберт­ку на Java, ко­то­рая бу­дет вы­зы­вать по­лез­ный код на­шей про­грам­мы с по­мо­щью JNI. По­сколь­ку од­на из за­дач, ко­то­рую мы ста­вим пе­ред со­бой, за­клю­ча­ет­ся в уп­ро­щении пе­ре­но­са на Android про­грамм, пред­на­зна­чен­ных для на­столь­ных вер­сий Linux, возника­ет во­прос, на­сколь­ко дол­жен из­менить­ся код про­грам­мы, на­пи­сан­ной на C или C++. От­вет на этот во­прос за­ви­сит от то­го, на­сколь­ко пе­ре­но­си­мая про­грам­ма по сво­ему по­ве­дению долж­на быть по­хо­жа на стан­дарт­ное при­ло­жение Android. {{Врезка|right|Заголовок=Android и мно­го­за­дач­ность |Ширина=35%|Содержание= Хо­тя Android – мно­го­за­дач­ная сис­те­ма, эта мно­го­за­дач­ность ра­бо­та­ет не со­всем так, как в ОС для ПК. Пред­по­ла­га­ет­ся, что в ка­ж­дый мо­мент вре­мени поль­зо­ва­тель ра­бо­та­ет толь­ко с одним при­ло­жением (ок­но ко­то­ро­го занима­ет весь эк­ран уст­рой­ст­ва). Дру­гие про­цес­сы, ок­на ко­то­рых не вид­ны, рас­смат­ри­ва­ют­ся сис­те­мой как про­цес­сы заднего пла­на (воз­мож­ны еще про­цес­сы, у ко­то­рых во­об­ще нет окон, но мы на них оста­нав­ли­вать­ся не бу­дем). Про­цес­сы заднего пла­на мо­гут про­дол­жать ра­бо­ту, но в слу­чае, ес­ли сис­те­ме не бу­дет хва­тать па­мя­ти, лю­бой из этих про­цес­сов мо­жет быть ав­то­ма­ти­че­­ски за­вер­шен и вы­гру­жен. При этом сис­те­ма не толь­ко не спра­ши­ва­ет поль­зо­ва­те­ля о том, со­гла­сен ли он на вы­груз­ку при­ло­жения, но и не пре­ду­пре­ж­да­ет его об этом (са­ма про­грам­ма, ес­те­ст­вен­но, по­лу­ча­ет от сис­те­мы со­от­вет­ст­вую­щие сиг­на­лы).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|right|Заголовок=Android и мно­го­за­дач­ность |Ширина=35%|Содержание= Хо­тя Android – мно­го­за­дач­ная сис­те­ма, эта мно­го­за­дач­ность ра­бо­та­ет не со­всем так, как в ОС для ПК. Пред­по­ла­га­ет­ся, что в ка­ж­дый мо­мент вре­мени поль­зо­ва­тель ра­бо­та­ет толь­ко с одним при­ло­жением (ок­но ко­то­ро­го занима­ет весь эк­ран уст­рой­ст­ва). Дру­гие про­цес­сы, ок­на ко­то­рых не вид­ны, рас­смат­ри­ва­ют­ся сис­те­мой как про­цес­сы заднего пла­на (воз­мож­ны еще про­цес­сы, у ко­то­рых во­об­ще нет окон, но мы на них оста­нав­ли­вать­ся не бу­дем). Про­цес­сы заднего пла­на мо­гут про­дол­жать ра­бо­ту, но в слу­чае, ес­ли сис­те­ме не бу­дет хва­тать па­мя­ти, лю­бой из этих про­цес­сов мо­жет быть ав­то­ма­ти­че­­ски за­вер­шен и вы­гру­жен. При этом сис­те­ма не толь­ко не спра­ши­ва­ет поль­зо­ва­те­ля о том, со­гла­сен ли он на вы­груз­ку при­ло­жения, но и не пре­ду­пре­ж­да­ет его об этом (са­ма про­грам­ма, ес­те­ст­вен­но, по­лу­ча­ет от сис­те­мы со­от­вет­ст­вую­щие сиг­на­лы).&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В идеа­ле при­ну­ди­тель­ная вы­груз­ка и по­втор­ный за­пуск при­ло­жения во­об­ще долж­ны быть неза­мет­ны для поль­зо­ва­те­ля. В мо­мент вы­груз­ки при­ло­жение долж­но со­хра­нять ин­фор­ма­цию о сво­ем со­стоянии и восста­нав­ли­вать это со­стояние при по­втор­ной за­груз­ке. На прак­ти­ке так про­ис­хо­дит не всегда. При этом, ра­зу­ме­ет­ся, со­вер­шен­но недо­пусти­ма си­туа­ция, когда при­ну­ди­тель­ная вы­груз­ка про­грам­мы при­во­дит к ка­ким-то ошиб­кам. В этом ас­пек­те про­грам­ми­ро­вание для Android от­ли­ча­ет­ся от про­грам­ми­ро­вания для ПК, где пред­по­ла­га­ет­ся, что про­грам­ма бу­дет ра­бо­тать до тех пор, по­ка поль­зо­ва­тель не за­хо­чет за­вер­шить ее (и в этом слу­чае от­вет­ст­вен­ность за со­хранение дан­ных ло­жит­ся на поль­зо­ва­те­ля).}} &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В идеа­ле при­ну­ди­тель­ная вы­груз­ка и по­втор­ный за­пуск при­ло­жения во­об­ще долж­ны быть неза­мет­ны для поль­зо­ва­те­ля. В мо­мент вы­груз­ки при­ло­жение долж­но со­хра­нять ин­фор­ма­цию о сво­ем со­стоянии и восста­нав­ли­вать это со­стояние при по­втор­ной за­груз­ке. На прак­ти­ке так про­ис­хо­дит не всегда. При этом, ра­зу­ме­ет­ся, со­вер­шен­но недо­пусти­ма си­туа­ция, когда при­ну­ди­тель­ная вы­груз­ка про­грам­мы при­во­дит к ка­ким-то ошиб­кам. В этом ас­пек­те про­грам­ми­ро­вание для Android от­ли­ча­ет­ся от про­грам­ми­ро­вания для ПК, где пред­по­ла­га­ет­ся, что про­грам­ма бу­дет ра­бо­тать до тех пор, по­ка поль­зо­ва­тель не за­хо­чет за­вер­шить ее (и в этом слу­чае от­вет­ст­вен­ность за со­хранение дан­ных ло­жит­ся на поль­зо­ва­те­ля).}} &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;В са­мом про­стом слу­чае код про­грам­мы, на­пи­сан­ной на C или C++, не при­дет­ся ме­нять во­об­ще. Но по­лу­чен­ная в ре­зуль­та­те про­грам­ма бу­дет вес­ти се­бя не со­всем так, как обыч­ные при­ло­жения Android. Бо­лее глу­бо­кая «ан­д­рои­ди­за­ция» про­грамм по­тре­бу­ет внесения из­менений в их ар­хи­тек­ту­ру в со­от­вет­ст­вии с тре­бо­вания­ми ОС Android.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В ка­че­­ст­ве при­ме­ра про­грам­мы, ра­бо­таю­щей с гра­фи­кой, ко­то­рую мож­но с минималь­ны­ми из­менения­ми пе­ренести на плат­фор­му Android, мы рас­смот­рим про­стую про­грам­му, ис­поль­зую­щую биб­лио­те­ку SDL (www.libsdl.org). Вы­бор SDL не слу­ча­ен. Эта биб­лио­те­ка уже дав­но ис­поль­зу­ет­ся про­грам­ми­ста­ми-умель­ца­ми в про­цес­се пе­ре­но­са игр на мо­биль­ные плат­фор­мы (доста­точ­но на­з­вать иг­ру OpenTTD, в ко­то­рую мож­но по­иг­рать и на плат­фор­ме Android). Кро­ме то­го, на­чи­ная с но­вей­шей вер­сии SDL – SDL 2, плат­фор­ма Android под­дер­жи­ва­ет­ся биб­лио­те­кой офи­ци­аль­но. Итак, до­пустим, мы хо­тим пор­ти­ро­вать на Android про­стую про­грам­му, на­пи­сан­ную с ис­поль­зо­ванием SDL:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В ка­че­­ст­ве при­ме­ра про­грам­мы, ра­бо­таю­щей с гра­фи­кой, ко­то­рую мож­но с минималь­ны­ми из­менения­ми пе­ренести на плат­фор­му Android, мы рас­смот­рим про­стую про­грам­му, ис­поль­зую­щую биб­лио­те­ку SDL (www.libsdl.org). Вы­бор SDL не слу­ча­ен. Эта биб­лио­те­ка уже дав­но ис­поль­зу­ет­ся про­грам­ми­ста­ми-умель­ца­ми в про­цес­се пе­ре­но­са игр на мо­биль­ные плат­фор­мы (доста­точ­но на­з­вать иг­ру OpenTTD, в ко­то­рую мож­но по­иг­рать и на плат­фор­ме Android). Кро­ме то­го, на­чи­ная с но­вей­шей вер­сии SDL – SDL 2, плат­фор­ма Android под­дер­жи­ва­ет­ся биб­лио­те­кой офи­ци­аль­но. Итак, до­пустим, мы хо­тим пор­ти­ро­вать на Android про­стую про­грам­му, на­пи­сан­ную с ис­поль­зо­ванием SDL:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF157:ARM_%D0%B8_Android:%D0%9F%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=17271&amp;oldid=prev</id>
		<title>Olkol: /* Ра­бо­та с гра­фи­кой с по­мо­щью SDL */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF157:ARM_%D0%B8_Android:%D0%9F%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=17271&amp;oldid=prev"/>
				<updated>2018-07-22T03:48:21Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Ра­бо­та с гра­фи­кой с по­мо­щью SDL&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 03:48, 22 июля 2018&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 103:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 103:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Как мы уже ви­де­ли, на­шим про­грам­мам доступ­ны все сред­ст­ва вы­во­да гра­фи­ки Android, на­чи­ная с OpenGL ES и за­кан­чи­вая ви­део­бу­фе­ром. Ос­та­лось толь­ко встро­ить гра­фи­че­­ский вы­вод на­ше­го при­ло­жения в об­щую ме­ханику ра­бо­ты опе­ра­ци­он­ной сис­те­мы. Са­мый про­стой спо­соб сде­лать это – на­пи­сать оберт­ку на Java, ко­то­рая бу­дет вы­зы­вать по­лез­ный код на­шей про­грам­мы с по­мо­щью JNI. По­сколь­ку од­на из за­дач, ко­то­рую мы ста­вим пе­ред со­бой, за­клю­ча­ет­ся в уп­ро­щении пе­ре­но­са на Android про­грамм, пред­на­зна­чен­ных для на­столь­ных вер­сий Linux, возника­ет во­прос, на­сколь­ко дол­жен из­менить­ся код про­грам­мы, на­пи­сан­ной на C или C++. От­вет на этот во­прос за­ви­сит от то­го, на­сколь­ко пе­ре­но­си­мая про­грам­ма по сво­ему по­ве­дению долж­на быть по­хо­жа на стан­дарт­ное при­ло­жение Android. В са­мом про­стом слу­чае код про­грам­мы, на­пи­сан­ной на C или C++, не при­дет­ся ме­нять во­об­ще. Но по­лу­чен­ная в ре­зуль­та­те про­грам­ма бу­дет вес­ти се­бя не со­всем так, как обыч­ные при­ло­жения Android. Бо­лее глу­бо­кая «ан­д­рои­ди­за­ция» про­грамм по­тре­бу­ет внесения из­менений в их ар­хи­тек­ту­ру в со­от­вет­ст­вии с тре­бо­вания­ми ОС Android.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Как мы уже ви­де­ли, на­шим про­грам­мам доступ­ны все сред­ст­ва вы­во­да гра­фи­ки Android, на­чи­ная с OpenGL ES и за­кан­чи­вая ви­део­бу­фе­ром. Ос­та­лось толь­ко встро­ить гра­фи­че­­ский вы­вод на­ше­го при­ло­жения в об­щую ме­ханику ра­бо­ты опе­ра­ци­он­ной сис­те­мы. Са­мый про­стой спо­соб сде­лать это – на­пи­сать оберт­ку на Java, ко­то­рая бу­дет вы­зы­вать по­лез­ный код на­шей про­грам­мы с по­мо­щью JNI. По­сколь­ку од­на из за­дач, ко­то­рую мы ста­вим пе­ред со­бой, за­клю­ча­ет­ся в уп­ро­щении пе­ре­но­са на Android про­грамм, пред­на­зна­чен­ных для на­столь­ных вер­сий Linux, возника­ет во­прос, на­сколь­ко дол­жен из­менить­ся код про­грам­мы, на­пи­сан­ной на C или C++. От­вет на этот во­прос за­ви­сит от то­го, на­сколь­ко пе­ре­но­си­мая про­грам­ма по сво­ему по­ве­дению долж­на быть по­хо­жа на стан­дарт­ное при­ло­жение Android. В са­мом про­стом слу­чае код про­грам­мы, на­пи­сан­ной на C или C++, не при­дет­ся ме­нять во­об­ще. Но по­лу­чен­ная в ре­зуль­та­те про­грам­ма бу­дет вес­ти се­бя не со­всем так, как обыч­ные при­ло­жения Android. Бо­лее глу­бо­кая «ан­д­рои­ди­за­ция» про­грамм по­тре­бу­ет внесения из­менений в их ар­хи­тек­ту­ру в со­от­вет­ст­вии с тре­бо­вания­ми ОС Android.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|right|Заголовок=Android и мно­го­за­дач­ность |Ширина=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;30&lt;/del&gt;%|Содержание= Хо­тя Android – мно­го­за­дач­ная сис­те­ма, эта мно­го­за­дач­ность ра­бо­та­ет не со­всем так, как в ОС для ПК. Пред­по­ла­га­ет­ся, что в ка­ж­дый мо­мент вре­мени поль­зо­ва­тель ра­бо­та­ет толь­ко с одним при­ло­жением (ок­но ко­то­ро­го занима­ет весь эк­ран уст­рой­ст­ва). Дру­гие про­цес­сы, ок­на ко­то­рых не вид­ны, рас­смат­ри­ва­ют­ся сис­те­мой как про­цес­сы заднего пла­на (воз­мож­ны еще про­цес­сы, у ко­то­рых во­об­ще нет окон, но мы на них оста­нав­ли­вать­ся не бу­дем). Про­цес­сы заднего пла­на мо­гут про­дол­жать ра­бо­ту, но в слу­чае, ес­ли сис­те­ме не бу­дет хва­тать па­мя­ти, лю­бой из этих про­цес­сов мо­жет быть ав­то­ма­ти­че­­ски за­вер­шен и вы­гру­жен. При этом сис­те­ма не толь­ко не спра­ши­ва­ет поль­зо­ва­те­ля о том, со­гла­сен ли он на вы­груз­ку при­ло­жения, но и не пре­ду­пре­ж­да­ет его об этом (са­ма про­грам­ма, ес­те­ст­вен­но, по­лу­ча­ет от сис­те­мы со­от­вет­ст­вую­щие сиг­на­лы).&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|right|Заголовок=Android и мно­го­за­дач­ность |Ширина=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;35&lt;/ins&gt;%|Содержание= Хо­тя Android – мно­го­за­дач­ная сис­те­ма, эта мно­го­за­дач­ность ра­бо­та­ет не со­всем так, как в ОС для ПК. Пред­по­ла­га­ет­ся, что в ка­ж­дый мо­мент вре­мени поль­зо­ва­тель ра­бо­та­ет толь­ко с одним при­ло­жением (ок­но ко­то­ро­го занима­ет весь эк­ран уст­рой­ст­ва). Дру­гие про­цес­сы, ок­на ко­то­рых не вид­ны, рас­смат­ри­ва­ют­ся сис­те­мой как про­цес­сы заднего пла­на (воз­мож­ны еще про­цес­сы, у ко­то­рых во­об­ще нет окон, но мы на них оста­нав­ли­вать­ся не бу­дем). Про­цес­сы заднего пла­на мо­гут про­дол­жать ра­бо­ту, но в слу­чае, ес­ли сис­те­ме не бу­дет хва­тать па­мя­ти, лю­бой из этих про­цес­сов мо­жет быть ав­то­ма­ти­че­­ски за­вер­шен и вы­гру­жен. При этом сис­те­ма не толь­ко не спра­ши­ва­ет поль­зо­ва­те­ля о том, со­гла­сен ли он на вы­груз­ку при­ло­жения, но и не пре­ду­пре­ж­да­ет его об этом (са­ма про­грам­ма, ес­те­ст­вен­но, по­лу­ча­ет от сис­те­мы со­от­вет­ст­вую­щие сиг­на­лы).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В идеа­ле при­ну­ди­тель­ная вы­груз­ка и по­втор­ный за­пуск при­ло­жения во­об­ще долж­ны быть неза­мет­ны для поль­зо­ва­те­ля. В мо­мент вы­груз­ки при­ло­жение долж­но со­хра­нять ин­фор­ма­цию о сво­ем со­стоянии и восста­нав­ли­вать это со­стояние при по­втор­ной за­груз­ке. На прак­ти­ке так про­ис­хо­дит не всегда. При этом, ра­зу­ме­ет­ся, со­вер­шен­но недо­пусти­ма си­туа­ция, когда при­ну­ди­тель­ная вы­груз­ка про­грам­мы при­во­дит к ка­ким-то ошиб­кам. В этом ас­пек­те про­грам­ми­ро­вание для Android от­ли­ча­ет­ся от про­грам­ми­ро­вания для ПК, где пред­по­ла­га­ет­ся, что про­грам­ма бу­дет ра­бо­тать до тех пор, по­ка поль­зо­ва­тель не за­хо­чет за­вер­шить ее (и в этом слу­чае от­вет­ст­вен­ность за со­хранение дан­ных ло­жит­ся на поль­зо­ва­те­ля).}} &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В идеа­ле при­ну­ди­тель­ная вы­груз­ка и по­втор­ный за­пуск при­ло­жения во­об­ще долж­ны быть неза­мет­ны для поль­зо­ва­те­ля. В мо­мент вы­груз­ки при­ло­жение долж­но со­хра­нять ин­фор­ма­цию о сво­ем со­стоянии и восста­нав­ли­вать это со­стояние при по­втор­ной за­груз­ке. На прак­ти­ке так про­ис­хо­дит не всегда. При этом, ра­зу­ме­ет­ся, со­вер­шен­но недо­пусти­ма си­туа­ция, когда при­ну­ди­тель­ная вы­груз­ка про­грам­мы при­во­дит к ка­ким-то ошиб­кам. В этом ас­пек­те про­грам­ми­ро­вание для Android от­ли­ча­ет­ся от про­грам­ми­ро­вания для ПК, где пред­по­ла­га­ет­ся, что про­грам­ма бу­дет ра­бо­тать до тех пор, по­ка поль­зо­ва­тель не за­хо­чет за­вер­шить ее (и в этом слу­чае от­вет­ст­вен­ность за со­хранение дан­ных ло­жит­ся на поль­зо­ва­те­ля).}} &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF157:ARM_%D0%B8_Android:%D0%9F%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=17270&amp;oldid=prev</id>
		<title>Olkol: /* Ра­бо­та с гра­фи­кой с по­мо­щью SDL */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF157:ARM_%D0%B8_Android:%D0%9F%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=17270&amp;oldid=prev"/>
				<updated>2018-07-22T03:46:46Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Ра­бо­та с гра­фи­кой с по­мо­щью SDL&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 03:46, 22 июля 2018&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 103:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 103:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Как мы уже ви­де­ли, на­шим про­грам­мам доступ­ны все сред­ст­ва вы­во­да гра­фи­ки Android, на­чи­ная с OpenGL ES и за­кан­чи­вая ви­део­бу­фе­ром. Ос­та­лось толь­ко встро­ить гра­фи­че­­ский вы­вод на­ше­го при­ло­жения в об­щую ме­ханику ра­бо­ты опе­ра­ци­он­ной сис­те­мы. Са­мый про­стой спо­соб сде­лать это – на­пи­сать оберт­ку на Java, ко­то­рая бу­дет вы­зы­вать по­лез­ный код на­шей про­грам­мы с по­мо­щью JNI. По­сколь­ку од­на из за­дач, ко­то­рую мы ста­вим пе­ред со­бой, за­клю­ча­ет­ся в уп­ро­щении пе­ре­но­са на Android про­грамм, пред­на­зна­чен­ных для на­столь­ных вер­сий Linux, возника­ет во­прос, на­сколь­ко дол­жен из­менить­ся код про­грам­мы, на­пи­сан­ной на C или C++. От­вет на этот во­прос за­ви­сит от то­го, на­сколь­ко пе­ре­но­си­мая про­грам­ма по сво­ему по­ве­дению долж­на быть по­хо­жа на стан­дарт­ное при­ло­жение Android. В са­мом про­стом слу­чае код про­грам­мы, на­пи­сан­ной на C или C++, не при­дет­ся ме­нять во­об­ще. Но по­лу­чен­ная в ре­зуль­та­те про­грам­ма бу­дет вес­ти се­бя не со­всем так, как обыч­ные при­ло­жения Android. Бо­лее глу­бо­кая «ан­д­рои­ди­за­ция» про­грамм по­тре­бу­ет внесения из­менений в их ар­хи­тек­ту­ру в со­от­вет­ст­вии с тре­бо­вания­ми ОС Android.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Как мы уже ви­де­ли, на­шим про­грам­мам доступ­ны все сред­ст­ва вы­во­да гра­фи­ки Android, на­чи­ная с OpenGL ES и за­кан­чи­вая ви­део­бу­фе­ром. Ос­та­лось толь­ко встро­ить гра­фи­че­­ский вы­вод на­ше­го при­ло­жения в об­щую ме­ханику ра­бо­ты опе­ра­ци­он­ной сис­те­мы. Са­мый про­стой спо­соб сде­лать это – на­пи­сать оберт­ку на Java, ко­то­рая бу­дет вы­зы­вать по­лез­ный код на­шей про­грам­мы с по­мо­щью JNI. По­сколь­ку од­на из за­дач, ко­то­рую мы ста­вим пе­ред со­бой, за­клю­ча­ет­ся в уп­ро­щении пе­ре­но­са на Android про­грамм, пред­на­зна­чен­ных для на­столь­ных вер­сий Linux, возника­ет во­прос, на­сколь­ко дол­жен из­менить­ся код про­грам­мы, на­пи­сан­ной на C или C++. От­вет на этот во­прос за­ви­сит от то­го, на­сколь­ко пе­ре­но­си­мая про­грам­ма по сво­ему по­ве­дению долж­на быть по­хо­жа на стан­дарт­ное при­ло­жение Android. В са­мом про­стом слу­чае код про­грам­мы, на­пи­сан­ной на C или C++, не при­дет­ся ме­нять во­об­ще. Но по­лу­чен­ная в ре­зуль­та­те про­грам­ма бу­дет вес­ти се­бя не со­всем так, как обыч­ные при­ло­жения Android. Бо­лее глу­бо­кая «ан­д­рои­ди­за­ция» про­грамм по­тре­бу­ет внесения из­менений в их ар­хи­тек­ту­ру в со­от­вет­ст­вии с тре­бо­вания­ми ОС Android.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|right|Заголовок=Android и мно­го­за­дач­ность |Ширина=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;50&lt;/del&gt;%|Содержание= Хо­тя Android – мно­го­за­дач­ная сис­те­ма, эта мно­го­за­дач­ность ра­бо­та­ет не со­всем так, как в ОС для ПК. Пред­по­ла­га­ет­ся, что в ка­ж­дый мо­мент вре­мени поль­зо­ва­тель ра­бо­та­ет толь­ко с одним при­ло­жением (ок­но ко­то­ро­го занима­ет весь эк­ран уст­рой­ст­ва). Дру­гие про­цес­сы, ок­на ко­то­рых не вид­ны, рас­смат­ри­ва­ют­ся сис­те­мой как про­цес­сы заднего пла­на (воз­мож­ны еще про­цес­сы, у ко­то­рых во­об­ще нет окон, но мы на них оста­нав­ли­вать­ся не бу­дем). Про­цес­сы заднего пла­на мо­гут про­дол­жать ра­бо­ту, но в слу­чае, ес­ли сис­те­ме не бу­дет хва­тать па­мя­ти, лю­бой из этих про­цес­сов мо­жет быть ав­то­ма­ти­че­­ски за­вер­шен и вы­гру­жен. При этом сис­те­ма не толь­ко не спра­ши­ва­ет поль­зо­ва­те­ля о том, со­гла­сен ли он на вы­груз­ку при­ло­жения, но и не пре­ду­пре­ж­да­ет его об этом (са­ма про­грам­ма, ес­те­ст­вен­но, по­лу­ча­ет от сис­те­мы со­от­вет­ст­вую­щие сиг­на­лы).&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|right|Заголовок=Android и мно­го­за­дач­ность |Ширина=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;30&lt;/ins&gt;%|Содержание= Хо­тя Android – мно­го­за­дач­ная сис­те­ма, эта мно­го­за­дач­ность ра­бо­та­ет не со­всем так, как в ОС для ПК. Пред­по­ла­га­ет­ся, что в ка­ж­дый мо­мент вре­мени поль­зо­ва­тель ра­бо­та­ет толь­ко с одним при­ло­жением (ок­но ко­то­ро­го занима­ет весь эк­ран уст­рой­ст­ва). Дру­гие про­цес­сы, ок­на ко­то­рых не вид­ны, рас­смат­ри­ва­ют­ся сис­те­мой как про­цес­сы заднего пла­на (воз­мож­ны еще про­цес­сы, у ко­то­рых во­об­ще нет окон, но мы на них оста­нав­ли­вать­ся не бу­дем). Про­цес­сы заднего пла­на мо­гут про­дол­жать ра­бо­ту, но в слу­чае, ес­ли сис­те­ме не бу­дет хва­тать па­мя­ти, лю­бой из этих про­цес­сов мо­жет быть ав­то­ма­ти­че­­ски за­вер­шен и вы­гру­жен. При этом сис­те­ма не толь­ко не спра­ши­ва­ет поль­зо­ва­те­ля о том, со­гла­сен ли он на вы­груз­ку при­ло­жения, но и не пре­ду­пре­ж­да­ет его об этом (са­ма про­грам­ма, ес­те­ст­вен­но, по­лу­ча­ет от сис­те­мы со­от­вет­ст­вую­щие сиг­на­лы).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В идеа­ле при­ну­ди­тель­ная вы­груз­ка и по­втор­ный за­пуск при­ло­жения во­об­ще долж­ны быть неза­мет­ны для поль­зо­ва­те­ля. В мо­мент вы­груз­ки при­ло­жение долж­но со­хра­нять ин­фор­ма­цию о сво­ем со­стоянии и восста­нав­ли­вать это со­стояние при по­втор­ной за­груз­ке. На прак­ти­ке так про­ис­хо­дит не всегда. При этом, ра­зу­ме­ет­ся, со­вер­шен­но недо­пусти­ма си­туа­ция, когда при­ну­ди­тель­ная вы­груз­ка про­грам­мы при­во­дит к ка­ким-то ошиб­кам. В этом ас­пек­те про­грам­ми­ро­вание для Android от­ли­ча­ет­ся от про­грам­ми­ро­вания для ПК, где пред­по­ла­га­ет­ся, что про­грам­ма бу­дет ра­бо­тать до тех пор, по­ка поль­зо­ва­тель не за­хо­чет за­вер­шить ее (и в этом слу­чае от­вет­ст­вен­ность за со­хранение дан­ных ло­жит­ся на поль­зо­ва­те­ля).}} &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В идеа­ле при­ну­ди­тель­ная вы­груз­ка и по­втор­ный за­пуск при­ло­жения во­об­ще долж­ны быть неза­мет­ны для поль­зо­ва­те­ля. В мо­мент вы­груз­ки при­ло­жение долж­но со­хра­нять ин­фор­ма­цию о сво­ем со­стоянии и восста­нав­ли­вать это со­стояние при по­втор­ной за­груз­ке. На прак­ти­ке так про­ис­хо­дит не всегда. При этом, ра­зу­ме­ет­ся, со­вер­шен­но недо­пусти­ма си­туа­ция, когда при­ну­ди­тель­ная вы­груз­ка про­грам­мы при­во­дит к ка­ким-то ошиб­кам. В этом ас­пек­те про­грам­ми­ро­вание для Android от­ли­ча­ет­ся от про­грам­ми­ро­вания для ПК, где пред­по­ла­га­ет­ся, что про­грам­ма бу­дет ра­бо­тать до тех пор, по­ка поль­зо­ва­тель не за­хо­чет за­вер­шить ее (и в этом слу­чае от­вет­ст­вен­ность за со­хранение дан­ных ло­жит­ся на поль­зо­ва­те­ля).}} &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 109:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 109:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В ка­че­­ст­ве при­ме­ра про­грам­мы, ра­бо­таю­щей с гра­фи­кой, ко­то­рую мож­но с минималь­ны­ми из­менения­ми пе­ренести на плат­фор­му Android, мы рас­смот­рим про­стую про­грам­му, ис­поль­зую­щую биб­лио­те­ку SDL (www.libsdl.org). Вы­бор SDL не слу­ча­ен. Эта биб­лио­те­ка уже дав­но ис­поль­зу­ет­ся про­грам­ми­ста­ми-умель­ца­ми в про­цес­се пе­ре­но­са игр на мо­биль­ные плат­фор­мы (доста­точ­но на­з­вать иг­ру OpenTTD, в ко­то­рую мож­но по­иг­рать и на плат­фор­ме Android). Кро­ме то­го, на­чи­ная с но­вей­шей вер­сии SDL – SDL 2, плат­фор­ма Android под­дер­жи­ва­ет­ся биб­лио­те­кой офи­ци­аль­но. Итак, до­пустим, мы хо­тим пор­ти­ро­вать на Android про­стую про­грам­му, на­пи­сан­ную с ис­поль­зо­ванием SDL:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В ка­че­­ст­ве при­ме­ра про­грам­мы, ра­бо­таю­щей с гра­фи­кой, ко­то­рую мож­но с минималь­ны­ми из­менения­ми пе­ренести на плат­фор­му Android, мы рас­смот­рим про­стую про­грам­му, ис­поль­зую­щую биб­лио­те­ку SDL (www.libsdl.org). Вы­бор SDL не слу­ча­ен. Эта биб­лио­те­ка уже дав­но ис­поль­зу­ет­ся про­грам­ми­ста­ми-умель­ца­ми в про­цес­се пе­ре­но­са игр на мо­биль­ные плат­фор­мы (доста­точ­но на­з­вать иг­ру OpenTTD, в ко­то­рую мож­но по­иг­рать и на плат­фор­ме Android). Кро­ме то­го, на­чи­ная с но­вей­шей вер­сии SDL – SDL 2, плат­фор­ма Android под­дер­жи­ва­ет­ся биб­лио­те­кой офи­ци­аль­но. Итак, до­пустим, мы хо­тим пор­ти­ро­вать на Android про­стую про­грам­му, на­пи­сан­ную с ис­поль­зо­ванием SDL:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;#include “SDL.h”&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;pre&amp;gt;&lt;/ins&gt;#include “SDL.h”&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;int SDL_main(int argc, char *argv[]) {&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;int SDL_main(int argc, char *argv[]) {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 168:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 168:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;/pre&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Про­грам­ма це­ли­ком по­за­им­ст­во­ва­на из до­ку­мен­та­ции SDL. Един­ст­вен­ное, что она де­ла­ет – вы­во­дит на эк­ран кар­тин­ку, за­гру­жен­ную из фай­ла data/android.bmp. По­сколь­ку на этот раз ре­зуль­та­том сбор­ки станет про­грам­ма с рас­ши­рением APK, нам при­дет­ся вы­полнить все фор­маль­но­сти, свя­зан­ные с соз­данием про­ек­та при­ло­жения Android: ор­ганизо­вать струк­ту­ру ди­рек­то­рий, как то­го тре­бу­ет сис­те­ма сбор­ки Android, и до­ба­вить необ­хо­ди­мые фай­лы, опи­сы­ваю­щие про­ект. Все это вы най­де­те на дис­ке (про­ект на­зы­ва­ет­ся sdl-android). Все фай­лы на­хо­дят­ся на сво­их мес­тах, за ис­клю­чением ис­ход­ных тек­стов биб­лио­те­ки SDL. Я не стал вклю­чать их по­то­му, что SDL 2.0 все еще пребывает в со­стоянии раз­ра­бот­ки и к мо­мен­ту вы­хо­да жур­на­ла под­держ­ка Android в этой биб­лио­те­ке, ско­рее все­го, бу­дет рас­ши­ре­на и улуч­ше­на.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Про­грам­ма це­ли­ком по­за­им­ст­во­ва­на из до­ку­мен­та­ции SDL. Един­ст­вен­ное, что она де­ла­ет – вы­во­дит на эк­ран кар­тин­ку, за­гру­жен­ную из фай­ла data/android.bmp. По­сколь­ку на этот раз ре­зуль­та­том сбор­ки станет про­грам­ма с рас­ши­рением APK, нам при­дет­ся вы­полнить все фор­маль­но­сти, свя­зан­ные с соз­данием про­ек­та при­ло­жения Android: ор­ганизо­вать струк­ту­ру ди­рек­то­рий, как то­го тре­бу­ет сис­те­ма сбор­ки Android, и до­ба­вить необ­хо­ди­мые фай­лы, опи­сы­ваю­щие про­ект. Все это вы най­де­те на дис­ке (про­ект на­зы­ва­ет­ся sdl-android). Все фай­лы на­хо­дят­ся на сво­их мес­тах, за ис­клю­чением ис­ход­ных тек­стов биб­лио­те­ки SDL. Я не стал вклю­чать их по­то­му, что SDL 2.0 все еще пребывает в со­стоянии раз­ра­бот­ки и к мо­мен­ту вы­хо­да жур­на­ла под­держ­ка Android в этой биб­лио­те­ке, ско­рее все­го, бу­дет рас­ши­ре­на и улуч­ше­на.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF157:ARM_%D0%B8_Android:%D0%9F%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=17269&amp;oldid=prev</id>
		<title>Olkol: /* Ра­бо­та с гра­фи­кой с по­мо­щью SDL */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF157:ARM_%D0%B8_Android:%D0%9F%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=17269&amp;oldid=prev"/>
				<updated>2018-07-22T03:44:48Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Ра­бо­та с гра­фи­кой с по­мо­щью SDL&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 03:44, 22 июля 2018&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 103:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 103:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Как мы уже ви­де­ли, на­шим про­грам­мам доступ­ны все сред­ст­ва вы­во­да гра­фи­ки Android, на­чи­ная с OpenGL ES и за­кан­чи­вая ви­део­бу­фе­ром. Ос­та­лось толь­ко встро­ить гра­фи­че­­ский вы­вод на­ше­го при­ло­жения в об­щую ме­ханику ра­бо­ты опе­ра­ци­он­ной сис­те­мы. Са­мый про­стой спо­соб сде­лать это – на­пи­сать оберт­ку на Java, ко­то­рая бу­дет вы­зы­вать по­лез­ный код на­шей про­грам­мы с по­мо­щью JNI. По­сколь­ку од­на из за­дач, ко­то­рую мы ста­вим пе­ред со­бой, за­клю­ча­ет­ся в уп­ро­щении пе­ре­но­са на Android про­грамм, пред­на­зна­чен­ных для на­столь­ных вер­сий Linux, возника­ет во­прос, на­сколь­ко дол­жен из­менить­ся код про­грам­мы, на­пи­сан­ной на C или C++. От­вет на этот во­прос за­ви­сит от то­го, на­сколь­ко пе­ре­но­си­мая про­грам­ма по сво­ему по­ве­дению долж­на быть по­хо­жа на стан­дарт­ное при­ло­жение Android. В са­мом про­стом слу­чае код про­грам­мы, на­пи­сан­ной на C или C++, не при­дет­ся ме­нять во­об­ще. Но по­лу­чен­ная в ре­зуль­та­те про­грам­ма бу­дет вес­ти се­бя не со­всем так, как обыч­ные при­ло­жения Android. Бо­лее глу­бо­кая «ан­д­рои­ди­за­ция» про­грамм по­тре­бу­ет внесения из­менений в их ар­хи­тек­ту­ру в со­от­вет­ст­вии с тре­бо­вания­ми ОС Android.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Как мы уже ви­де­ли, на­шим про­грам­мам доступ­ны все сред­ст­ва вы­во­да гра­фи­ки Android, на­чи­ная с OpenGL ES и за­кан­чи­вая ви­део­бу­фе­ром. Ос­та­лось толь­ко встро­ить гра­фи­че­­ский вы­вод на­ше­го при­ло­жения в об­щую ме­ханику ра­бо­ты опе­ра­ци­он­ной сис­те­мы. Са­мый про­стой спо­соб сде­лать это – на­пи­сать оберт­ку на Java, ко­то­рая бу­дет вы­зы­вать по­лез­ный код на­шей про­грам­мы с по­мо­щью JNI. По­сколь­ку од­на из за­дач, ко­то­рую мы ста­вим пе­ред со­бой, за­клю­ча­ет­ся в уп­ро­щении пе­ре­но­са на Android про­грамм, пред­на­зна­чен­ных для на­столь­ных вер­сий Linux, возника­ет во­прос, на­сколь­ко дол­жен из­менить­ся код про­грам­мы, на­пи­сан­ной на C или C++. От­вет на этот во­прос за­ви­сит от то­го, на­сколь­ко пе­ре­но­си­мая про­грам­ма по сво­ему по­ве­дению долж­на быть по­хо­жа на стан­дарт­ное при­ло­жение Android. В са­мом про­стом слу­чае код про­грам­мы, на­пи­сан­ной на C или C++, не при­дет­ся ме­нять во­об­ще. Но по­лу­чен­ная в ре­зуль­та­те про­грам­ма бу­дет вес­ти се­бя не со­всем так, как обыч­ные при­ло­жения Android. Бо­лее глу­бо­кая «ан­д­рои­ди­за­ция» про­грамм по­тре­бу­ет внесения из­менений в их ар­хи­тек­ту­ру в со­от­вет­ст­вии с тре­бо­вания­ми ОС Android.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|right|Заголовок=Android и мно­го­за­дач­ность |Ширина=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;20&lt;/del&gt;%|Содержание= Хо­тя Android – мно­го­за­дач­ная сис­те­ма, эта мно­го­за­дач­ность ра­бо­та­ет не со­всем так, как в ОС для ПК. Пред­по­ла­га­ет­ся, что в ка­ж­дый мо­мент вре­мени поль­зо­ва­тель ра­бо­та­ет толь­ко с одним при­ло­жением (ок­но ко­то­ро­го занима­ет весь эк­ран уст­рой­ст­ва). Дру­гие про­цес­сы, ок­на ко­то­рых не вид­ны, рас­смат­ри­ва­ют­ся сис­те­мой как про­цес­сы заднего пла­на (воз­мож­ны еще про­цес­сы, у ко­то­рых во­об­ще нет окон, но мы на них оста­нав­ли­вать­ся не бу­дем). Про­цес­сы заднего пла­на мо­гут про­дол­жать ра­бо­ту, но в слу­чае, ес­ли сис­те­ме не бу­дет хва­тать па­мя­ти, лю­бой из этих про­цес­сов мо­жет быть ав­то­ма­ти­че­­ски за­вер­шен и вы­гру­жен. При этом сис­те­ма не толь­ко не спра­ши­ва­ет поль­зо­ва­те­ля о том, со­гла­сен ли он на вы­груз­ку при­ло­жения, но и не пре­ду­пре­ж­да­ет его об этом (са­ма про­грам­ма, ес­те­ст­вен­но, по­лу­ча­ет от сис­те­мы со­от­вет­ст­вую­щие сиг­на­лы).&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|right|Заголовок=Android и мно­го­за­дач­ность |Ширина=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;50&lt;/ins&gt;%|Содержание= Хо­тя Android – мно­го­за­дач­ная сис­те­ма, эта мно­го­за­дач­ность ра­бо­та­ет не со­всем так, как в ОС для ПК. Пред­по­ла­га­ет­ся, что в ка­ж­дый мо­мент вре­мени поль­зо­ва­тель ра­бо­та­ет толь­ко с одним при­ло­жением (ок­но ко­то­ро­го занима­ет весь эк­ран уст­рой­ст­ва). Дру­гие про­цес­сы, ок­на ко­то­рых не вид­ны, рас­смат­ри­ва­ют­ся сис­те­мой как про­цес­сы заднего пла­на (воз­мож­ны еще про­цес­сы, у ко­то­рых во­об­ще нет окон, но мы на них оста­нав­ли­вать­ся не бу­дем). Про­цес­сы заднего пла­на мо­гут про­дол­жать ра­бо­ту, но в слу­чае, ес­ли сис­те­ме не бу­дет хва­тать па­мя­ти, лю­бой из этих про­цес­сов мо­жет быть ав­то­ма­ти­че­­ски за­вер­шен и вы­гру­жен. При этом сис­те­ма не толь­ко не спра­ши­ва­ет поль­зо­ва­те­ля о том, со­гла­сен ли он на вы­груз­ку при­ло­жения, но и не пре­ду­пре­ж­да­ет его об этом (са­ма про­грам­ма, ес­те­ст­вен­но, по­лу­ча­ет от сис­те­мы со­от­вет­ст­вую­щие сиг­на­лы).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В идеа­ле при­ну­ди­тель­ная вы­груз­ка и по­втор­ный за­пуск при­ло­жения во­об­ще долж­ны быть неза­мет­ны для поль­зо­ва­те­ля. В мо­мент вы­груз­ки при­ло­жение долж­но со­хра­нять ин­фор­ма­цию о сво­ем со­стоянии и восста­нав­ли­вать это со­стояние при по­втор­ной за­груз­ке. На прак­ти­ке так про­ис­хо­дит не всегда. При этом, ра­зу­ме­ет­ся, со­вер­шен­но недо­пусти­ма си­туа­ция, когда при­ну­ди­тель­ная вы­груз­ка про­грам­мы при­во­дит к ка­ким-то ошиб­кам. В этом ас­пек­те про­грам­ми­ро­вание для Android от­ли­ча­ет­ся от про­грам­ми­ро­вания для ПК, где пред­по­ла­га­ет­ся, что про­грам­ма бу­дет ра­бо­тать до тех пор, по­ка поль­зо­ва­тель не за­хо­чет за­вер­шить ее (и в этом слу­чае от­вет­ст­вен­ность за со­хранение дан­ных ло­жит­ся на поль­зо­ва­те­ля).}} &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В идеа­ле при­ну­ди­тель­ная вы­груз­ка и по­втор­ный за­пуск при­ло­жения во­об­ще долж­ны быть неза­мет­ны для поль­зо­ва­те­ля. В мо­мент вы­груз­ки при­ло­жение долж­но со­хра­нять ин­фор­ма­цию о сво­ем со­стоянии и восста­нав­ли­вать это со­стояние при по­втор­ной за­груз­ке. На прак­ти­ке так про­ис­хо­дит не всегда. При этом, ра­зу­ме­ет­ся, со­вер­шен­но недо­пусти­ма си­туа­ция, когда при­ну­ди­тель­ная вы­груз­ка про­грам­мы при­во­дит к ка­ким-то ошиб­кам. В этом ас­пек­те про­грам­ми­ро­вание для Android от­ли­ча­ет­ся от про­грам­ми­ро­вания для ПК, где пред­по­ла­га­ет­ся, что про­грам­ма бу­дет ра­бо­тать до тех пор, по­ка поль­зо­ва­тель не за­хо­чет за­вер­шить ее (и в этом слу­чае от­вет­ст­вен­ность за со­хранение дан­ных ло­жит­ся на поль­зо­ва­те­ля).}} &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF157:ARM_%D0%B8_Android:%D0%9F%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=17268&amp;oldid=prev</id>
		<title>Olkol: /* Счи­ты­вание дан­ных из ви­део­бу­фе­ра */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF157:ARM_%D0%B8_Android:%D0%9F%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=17268&amp;oldid=prev"/>
				<updated>2018-07-22T03:44:15Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Счи­ты­вание дан­ных из ви­део­бу­фе­ра&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 03:44, 22 июля 2018&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 100:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 100:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В ре­зуль­та­те бу­дет соз­дан файл screenshot.bmp, со­дер­жа­щий снимок эк­ра­на уст­рой­ст­ва.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В ре­зуль­та­те бу­дет соз­дан файл screenshot.bmp, со­дер­жа­щий снимок эк­ра­на уст­рой­ст­ва.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Ра­бо­та с гра­фи­кой с по­мо­щью SDL&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;==&lt;/ins&gt;Ра­бо­та с гра­фи­кой с по­мо­щью SDL&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;==&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Как мы уже ви­де­ли, на­шим про­грам­мам доступ­ны все сред­ст­ва вы­во­да гра­фи­ки Android, на­чи­ная с OpenGL ES и за­кан­чи­вая ви­део­бу­фе­ром. Ос­та­лось толь­ко встро­ить гра­фи­че­­ский вы­вод на­ше­го при­ло­жения в об­щую ме­ханику ра­бо­ты опе­ра­ци­он­ной сис­те­мы. Са­мый про­стой спо­соб сде­лать это – на­пи­сать оберт­ку на Java, ко­то­рая бу­дет вы­зы­вать по­лез­ный код на­шей про­грам­мы с по­мо­щью JNI. По­сколь­ку од­на из за­дач, ко­то­рую мы ста­вим пе­ред со­бой, за­клю­ча­ет­ся в уп­ро­щении пе­ре­но­са на Android про­грамм, пред­на­зна­чен­ных для на­столь­ных вер­сий Linux, возника­ет во­прос, на­сколь­ко дол­жен из­менить­ся код про­грам­мы, на­пи­сан­ной на C или C++. От­вет на этот во­прос за­ви­сит от то­го, на­сколь­ко пе­ре­но­си­мая про­грам­ма по сво­ему по­ве­дению долж­на быть по­хо­жа на стан­дарт­ное при­ло­жение Android. В са­мом про­стом слу­чае код про­грам­мы, на­пи­сан­ной на C или C++, не при­дет­ся ме­нять во­об­ще. Но по­лу­чен­ная в ре­зуль­та­те про­грам­ма бу­дет вес­ти се­бя не со­всем так, как обыч­ные при­ло­жения Android. Бо­лее глу­бо­кая «ан­д­рои­ди­за­ция» про­грамм по­тре­бу­ет внесения из­менений в их ар­хи­тек­ту­ру в со­от­вет­ст­вии с тре­бо­вания­ми ОС Android.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Как мы уже ви­де­ли, на­шим про­грам­мам доступ­ны все сред­ст­ва вы­во­да гра­фи­ки Android, на­чи­ная с OpenGL ES и за­кан­чи­вая ви­део­бу­фе­ром. Ос­та­лось толь­ко встро­ить гра­фи­че­­ский вы­вод на­ше­го при­ло­жения в об­щую ме­ханику ра­бо­ты опе­ра­ци­он­ной сис­те­мы. Са­мый про­стой спо­соб сде­лать это – на­пи­сать оберт­ку на Java, ко­то­рая бу­дет вы­зы­вать по­лез­ный код на­шей про­грам­мы с по­мо­щью JNI. По­сколь­ку од­на из за­дач, ко­то­рую мы ста­вим пе­ред со­бой, за­клю­ча­ет­ся в уп­ро­щении пе­ре­но­са на Android про­грамм, пред­на­зна­чен­ных для на­столь­ных вер­сий Linux, возника­ет во­прос, на­сколь­ко дол­жен из­менить­ся код про­грам­мы, на­пи­сан­ной на C или C++. От­вет на этот во­прос за­ви­сит от то­го, на­сколь­ко пе­ре­но­си­мая про­грам­ма по сво­ему по­ве­дению долж­на быть по­хо­жа на стан­дарт­ное при­ло­жение Android. В са­мом про­стом слу­чае код про­грам­мы, на­пи­сан­ной на C или C++, не при­дет­ся ме­нять во­об­ще. Но по­лу­чен­ная в ре­зуль­та­те про­грам­ма бу­дет вес­ти се­бя не со­всем так, как обыч­ные при­ло­жения Android. Бо­лее глу­бо­кая «ан­д­рои­ди­за­ция» про­грамм по­тре­бу­ет внесения из­менений в их ар­хи­тек­ту­ру в со­от­вет­ст­вии с тре­бо­вания­ми ОС Android.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;{{Врезка|right|Заголовок=Android и мно­го­за­дач­ность |Ширина=20%|Содержание= Хо­тя Android – мно­го­за­дач­ная сис­те­ма, эта мно­го­за­дач­ность ра­бо­та­ет не со­всем так, как в ОС для ПК. Пред­по­ла­га­ет­ся, что в ка­ж­дый мо­мент вре­мени поль­зо­ва­тель ра­бо­та­ет толь­ко с одним при­ло­жением (ок­но ко­то­ро­го занима­ет весь эк­ран уст­рой­ст­ва). Дру­гие про­цес­сы, ок­на ко­то­рых не вид­ны, рас­смат­ри­ва­ют­ся сис­те­мой как про­цес­сы заднего пла­на (воз­мож­ны еще про­цес­сы, у ко­то­рых во­об­ще нет окон, но мы на них оста­нав­ли­вать­ся не бу­дем). Про­цес­сы заднего пла­на мо­гут про­дол­жать ра­бо­ту, но в слу­чае, ес­ли сис­те­ме не бу­дет хва­тать па­мя­ти, лю­бой из этих про­цес­сов мо­жет быть ав­то­ма­ти­че­­ски за­вер­шен и вы­гру­жен. При этом сис­те­ма не толь­ко не спра­ши­ва­ет поль­зо­ва­те­ля о том, со­гла­сен ли он на вы­груз­ку при­ло­жения, но и не пре­ду­пре­ж­да­ет его об этом (са­ма про­грам­ма, ес­те­ст­вен­но, по­лу­ча­ет от сис­те­мы со­от­вет­ст­вую­щие сиг­на­лы).&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;В идеа­ле при­ну­ди­тель­ная вы­груз­ка и по­втор­ный за­пуск при­ло­жения во­об­ще долж­ны быть неза­мет­ны для поль­зо­ва­те­ля. В мо­мент вы­груз­ки при­ло­жение долж­но со­хра­нять ин­фор­ма­цию о сво­ем со­стоянии и восста­нав­ли­вать это со­стояние при по­втор­ной за­груз­ке. На прак­ти­ке так про­ис­хо­дит не всегда. При этом, ра­зу­ме­ет­ся, со­вер­шен­но недо­пусти­ма си­туа­ция, когда при­ну­ди­тель­ная вы­груз­ка про­грам­мы при­во­дит к ка­ким-то ошиб­кам. В этом ас­пек­те про­грам­ми­ро­вание для Android от­ли­ча­ет­ся от про­грам­ми­ро­вания для ПК, где пред­по­ла­га­ет­ся, что про­грам­ма бу­дет ра­бо­тать до тех пор, по­ка поль­зо­ва­тель не за­хо­чет за­вер­шить ее (и в этом слу­чае от­вет­ст­вен­ность за со­хранение дан­ных ло­жит­ся на поль­зо­ва­те­ля).}} &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В ка­че­­ст­ве при­ме­ра про­грам­мы, ра­бо­таю­щей с гра­фи­кой, ко­то­рую мож­но с минималь­ны­ми из­менения­ми пе­ренести на плат­фор­му Android, мы рас­смот­рим про­стую про­грам­му, ис­поль­зую­щую биб­лио­те­ку SDL (www.libsdl.org). Вы­бор SDL не слу­ча­ен. Эта биб­лио­те­ка уже дав­но ис­поль­зу­ет­ся про­грам­ми­ста­ми-умель­ца­ми в про­цес­се пе­ре­но­са игр на мо­биль­ные плат­фор­мы (доста­точ­но на­з­вать иг­ру OpenTTD, в ко­то­рую мож­но по­иг­рать и на плат­фор­ме Android). Кро­ме то­го, на­чи­ная с но­вей­шей вер­сии SDL – SDL 2, плат­фор­ма Android под­дер­жи­ва­ет­ся биб­лио­те­кой офи­ци­аль­но. Итак, до­пустим, мы хо­тим пор­ти­ро­вать на Android про­стую про­грам­му, на­пи­сан­ную с ис­поль­зо­ванием SDL:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В ка­че­­ст­ве при­ме­ра про­грам­мы, ра­бо­таю­щей с гра­фи­кой, ко­то­рую мож­но с минималь­ны­ми из­менения­ми пе­ренести на плат­фор­му Android, мы рас­смот­рим про­стую про­грам­му, ис­поль­зую­щую биб­лио­те­ку SDL (www.libsdl.org). Вы­бор SDL не слу­ча­ен. Эта биб­лио­те­ка уже дав­но ис­поль­зу­ет­ся про­грам­ми­ста­ми-умель­ца­ми в про­цес­се пе­ре­но­са игр на мо­биль­ные плат­фор­мы (доста­точ­но на­з­вать иг­ру OpenTTD, в ко­то­рую мож­но по­иг­рать и на плат­фор­ме Android). Кро­ме то­го, на­чи­ная с но­вей­шей вер­сии SDL – SDL 2, плат­фор­ма Android под­дер­жи­ва­ет­ся биб­лио­те­кой офи­ци­аль­но. Итак, до­пустим, мы хо­тим пор­ти­ро­вать на Android про­стую про­грам­му, на­пи­сан­ную с ис­поль­зо­ванием SDL:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF157:ARM_%D0%B8_Android:%D0%9F%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=17267&amp;oldid=prev</id>
		<title>Olkol: /* ARM и Android: Про­грам­ми­ро­ва­ние */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF157:ARM_%D0%B8_Android:%D0%9F%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=17267&amp;oldid=prev"/>
				<updated>2018-07-22T03:41:00Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;ARM и Android: Про­грам­ми­ро­ва­ние&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 03:41, 22 июля 2018&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 20:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 20:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Об­ра­ти­те внимание на ком­понен­ты SurfaeFlinger и PixelFlinger. По ка­кой-то при­чине сло­во «flinger» по­лю­би­лось раз­ра­бот­чи­кам Android, и они ши­ро­ко его ис­поль­зу­ют. На русский язык точнее все­го бы­ло бы пе­ре­вес­ти эти на­звания как «жонг­лер по­верх­но­стя­ми» (име­ют­ся в ви­ду вир­ту­аль­ные по­верх­но­сти, на ко­то­рые при­ло­жения вы­во­дят гра­фи­ку) и «жонг­лер пик­се­ля­ми». По­ми­мо про­че­го, ком­понен­ты про­ме­жу­точ­но­го слоя вы­пол­ня­ют про­грамм­ную эму­ля­цию от­сут­ст­вую­щих ком­понен­тов гра­фи­че­­ско­­го обо­ру­до­вания. На­при­мер, PixelFlinger мо­жет эму­ли­ро­вать под­держ­ку трех­мер­ной гра­фи­ки, ес­ли в сис­те­ме от­сут­ст­ву­ет ап­па­рат­ная под­держ­ка 3D. К это­му же уров­ню я отнес фай­лы-уст­рой­ст­ва, пре­достав­ляю­щие непо­сред­ст­вен­ный доступ к ви­део­бу­фе­ру сис­те­мы, хо­тя, воз­мож­но, их сле­до­ва­ло бы по­мес­тить уровнем ниже.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Об­ра­ти­те внимание на ком­понен­ты SurfaeFlinger и PixelFlinger. По ка­кой-то при­чине сло­во «flinger» по­лю­би­лось раз­ра­бот­чи­кам Android, и они ши­ро­ко его ис­поль­зу­ют. На русский язык точнее все­го бы­ло бы пе­ре­вес­ти эти на­звания как «жонг­лер по­верх­но­стя­ми» (име­ют­ся в ви­ду вир­ту­аль­ные по­верх­но­сти, на ко­то­рые при­ло­жения вы­во­дят гра­фи­ку) и «жонг­лер пик­се­ля­ми». По­ми­мо про­че­го, ком­понен­ты про­ме­жу­точ­но­го слоя вы­пол­ня­ют про­грамм­ную эму­ля­цию от­сут­ст­вую­щих ком­понен­тов гра­фи­че­­ско­­го обо­ру­до­вания. На­при­мер, PixelFlinger мо­жет эму­ли­ро­вать под­держ­ку трех­мер­ной гра­фи­ки, ес­ли в сис­те­ме от­сут­ст­ву­ет ап­па­рат­ная под­держ­ка 3D. К это­му же уров­ню я отнес фай­лы-уст­рой­ст­ва, пре­достав­ляю­щие непо­сред­ст­вен­ный доступ к ви­део­бу­фе­ру сис­те­мы, хо­тя, воз­мож­но, их сле­до­ва­ло бы по­мес­тить уровнем ниже.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;В со­от­вет­ст­вии с по­ка­зан­ной трех­уровневой сис­те­мой, у раз­ра­бот­чи­ка при­ло­жений на С и С++ есть три пу­ти взаи­мо­дей­ст­вия с гра­фи­че­­ски­­ми ком­понен­та­ми Android.&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|right|Заголовок= Как прой­ти в биб­лио­те­ку?|Ширина=30%|Содержание= Ес­ли вы планируе­те под­клю­чать к при­ло­жению на­пря­мую та­кие биб­лио­те­ки, как libflinger.so или libsufrfaceflinger.so, то имей­те в ви­ду, что ском­по­но­вать при­ло­жение с эти­ми биб­лио­те­ка­ми на эта­пе сбор­ки не уда­ст­ся. Android NDK про­сто ниче­го о них не зна­ет.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|right|Заголовок= Как прой­ти в биб­лио­те­ку?|Ширина=30%|Содержание= Ес­ли вы планируе­те под­клю­чать к при­ло­жению на­пря­мую та­кие биб­лио­те­ки, как libflinger.so или libsufrfaceflinger.so, то имей­те в ви­ду, что ском­по­но­вать при­ло­жение с эти­ми биб­лио­те­ка­ми на эта­пе сбор­ки не уда­ст­ся. Android NDK про­сто ниче­го о них не зна­ет.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Един­ст­вен­ный под­хо­дя­щий спо­соб – восполь­зо­вать­ся ме­то­дом яв­ной за­груз­ки биб­лио­тек во вре­мя вы­полнения про­грам­мы, с по­мо­щью функ­ций dlopen(), dlsym() и dlclose(). При этом вам все рав­но по­на­до­бят­ся за­го­ло­воч­ные фай­лы со­от­вет­ст­вую­щих биб­лио­тек. Вы най­де­те их в со­ста­ве NDK, в раз­де­ле ис­ход­ных тек­стов Android.}} &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Един­ст­вен­ный под­хо­дя­щий спо­соб – восполь­зо­вать­ся ме­то­дом яв­ной за­груз­ки биб­лио­тек во вре­мя вы­полнения про­грам­мы, с по­мо­щью функ­ций dlopen(), dlsym() и dlclose(). При этом вам все рав­но по­на­до­бят­ся за­го­ло­воч­ные фай­лы со­от­вет­ст­вую­щих биб­лио­тек. Вы най­де­те их в со­ста­ве NDK, в раз­де­ле ис­ход­ных тек­стов Android.}} &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;В со­от­вет­ст­вии с по­ка­зан­ной трех­уровневой сис­те­мой, у раз­ра­бот­чи­ка при­ло­жений на С и С++ есть три пу­ти взаи­мо­дей­ст­вия с гра­фи­че­­ски­­ми ком­понен­та­ми Android.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;[[Файл: Pic1_opt.jpeg|left |400px |thumb|Схе­ма взаи­мо­дей­ст­вия при­ло­же­ния Android и гра­фи­че­ских ком­по­нен­тов.]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Пер­вый путь за­клю­чат­ся в том, что­бы ис­поль­зо­вать код, на­пи­сан­ный на C и C++ внут­ри при­ло­жения Java, иг­раю­ще­го роль оберт­ки. Этот путь хо­рош тем, что при­ло­жение ве­дет се­бя по пра­ви­лам, уста­нов­лен­ным сис­те­мой, а зна­чит, в про­цес­се его ра­бо­ты мы мо­жем из­бе­жать непри­ят­ных сюр­при­зов.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Пер­вый путь за­клю­чат­ся в том, что­бы ис­поль­зо­вать код, на­пи­сан­ный на C и C++ внут­ри при­ло­жения Java, иг­раю­ще­го роль оберт­ки. Этот путь хо­рош тем, что при­ло­жение ве­дет се­бя по пра­ви­лам, уста­нов­лен­ным сис­те­мой, а зна­чит, в про­цес­се его ра­бо­ты мы мо­жем из­бе­жать непри­ят­ных сюр­при­зов.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 34:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 34:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Из пе­ре­чис­лен­ных вы­ше трех под­хо­дов к ра­бо­те с гра­фи­кой мы рас­смот­рим два наи­бо­лее ра­цио­наль­ных: пря­мое взаи­мо­дей­ст­вие с ви­део­бу­фе­ром и ис­поль­зо­вание тон­кой обо­лоч­ки Java во­круг ко­да про­грам­мы, на­пи­сан­но­го на C. За­од­но мы рас­смот­рим дру­гой, бо­лее про­стой спо­соб на­пи­сания Make-фай­лов для сбор­ки при­ло­жений Linux под Android. В от­ли­чие от рас­смот­рен­но­го в пре­ды­ду­щей ста­тье, этот спо­соб скры­ва­ет от нас мно­гие ин­те­рес­ные де­та­ли и ра­бо­та­ет толь­ко с NDK, за­то по­зво­ля­ет соз­да­вать бо­лее ком­пакт­ные Make-фай­лы.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Из пе­ре­чис­лен­ных вы­ше трех под­хо­дов к ра­бо­те с гра­фи­кой мы рас­смот­рим два наи­бо­лее ра­цио­наль­ных: пря­мое взаи­мо­дей­ст­вие с ви­део­бу­фе­ром и ис­поль­зо­вание тон­кой обо­лоч­ки Java во­круг ко­да про­грам­мы, на­пи­сан­но­го на C. За­од­но мы рас­смот­рим дру­гой, бо­лее про­стой спо­соб на­пи­сания Make-фай­лов для сбор­ки при­ло­жений Linux под Android. В от­ли­чие от рас­смот­рен­но­го в пре­ды­ду­щей ста­тье, этот спо­соб скры­ва­ет от нас мно­гие ин­те­рес­ные де­та­ли и ра­бо­та­ет толь­ко с NDK, за­то по­зво­ля­ет соз­да­вать бо­лее ком­пакт­ные Make-фай­лы.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Счи­ты­вание дан­ных из ви­део­бу­фе­ра&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;==&lt;/ins&gt;Счи­ты­вание дан­ных из ви­део­бу­фе­ра&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;==&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Уст­рой­ст­во ви­део­бу­фе­ра /dev/graphics/fb0 по­зво­ля­ет по­лу­чить пря­мой доступ к то­му, что про­ис­хо­дит на эк­ране уст­рой­ст­ва Android. Дан­ные, ко­то­рые мож­но счи­тать из фай­ла /dev/graphics/fb0, пред­став­ля­ют со­бой по­ток зна­чений пик­се­лей, где пер­вым идет верхний ле­вый пик­сель, а по­следним – нижний пра­вый. К это­му на­до до­ба­вить, что, по­сколь­ку уст­рой­ст­ва Android ис­поль­зу­ют двой­ную бу­фе­ри­за­цию, из фай­ла /dev/graphis/fb0 мож­но про­чи­тать со­дер­жи­мое сра­зу двух кад­ров ви­део­бу­фе­ра. Что­бы пре­об­ра­зо­вать этот по­ток «сы­рой» ин­фор­ма­ции в на­гляд­ный гра­фи­че­­ский фор­мат, необ­хо­ди­мо знать по крайней ме­ре два па­ра­мет­ра ви­део­сис­те­мы уст­рой­ст­ва: фор­мат хранения пик­се­лей, ко­то­рый тес­но свя­зан с ко­ли­че­­ст­вом цве­тов, ото­бра­жае­мых уст­рой­ст­вом, и раз­ре­шение эк­ра­на уст­рой­ст­ва по вер­ти­ка­ли и по го­ри­зон­та­ли. Пик­се­ли на эк­ра­нах Android мо­гут быть пред­став­ле­ны 16-ю, 24-мя и 32-мя би­та­ми. Ко­ли­че­­ст­во пик­се­лей на эк­ране ко­леб­лет­ся от 240 × 320 до 800 × 1280.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Уст­рой­ст­во ви­део­бу­фе­ра /dev/graphics/fb0 по­зво­ля­ет по­лу­чить пря­мой доступ к то­му, что про­ис­хо­дит на эк­ране уст­рой­ст­ва Android. Дан­ные, ко­то­рые мож­но счи­тать из фай­ла /dev/graphics/fb0, пред­став­ля­ют со­бой по­ток зна­чений пик­се­лей, где пер­вым идет верхний ле­вый пик­сель, а по­следним – нижний пра­вый. К это­му на­до до­ба­вить, что, по­сколь­ку уст­рой­ст­ва Android ис­поль­зу­ют двой­ную бу­фе­ри­за­цию, из фай­ла /dev/graphis/fb0 мож­но про­чи­тать со­дер­жи­мое сра­зу двух кад­ров ви­део­бу­фе­ра. Что­бы пре­об­ра­зо­вать этот по­ток «сы­рой» ин­фор­ма­ции в на­гляд­ный гра­фи­че­­ский фор­мат, необ­хо­ди­мо знать по крайней ме­ре два па­ра­мет­ра ви­део­сис­те­мы уст­рой­ст­ва: фор­мат хранения пик­се­лей, ко­то­рый тес­но свя­зан с ко­ли­че­­ст­вом цве­тов, ото­бра­жае­мых уст­рой­ст­вом, и раз­ре­шение эк­ра­на уст­рой­ст­ва по вер­ти­ка­ли и по го­ри­зон­та­ли. Пик­се­ли на эк­ра­нах Android мо­гут быть пред­став­ле­ны 16-ю, 24-мя и 32-мя би­та­ми. Ко­ли­че­­ст­во пик­се­лей на эк­ране ко­леб­лет­ся от 240 × 320 до 800 × 1280.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF157:ARM_%D0%B8_Android:%D0%9F%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=17265&amp;oldid=prev</id>
		<title>Olkol: Новая страница: «Категория:Постоянные рубрики   Категория:Android    '''Ваши программные наработки не проп…»</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF157:ARM_%D0%B8_Android:%D0%9F%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;diff=17265&amp;oldid=prev"/>
				<updated>2018-07-22T03:35:02Z</updated>
		
		<summary type="html">&lt;p&gt;Новая страница: «&lt;a href=&quot;/wiki/index.php?title=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%9F%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%BD%D1%8B%D0%B5_%D1%80%D1%83%D0%B1%D1%80%D0%B8%D0%BA%D0%B8&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Категория:Постоянные рубрики (страница не существует)&quot;&gt;Категория:Постоянные рубрики&lt;/a&gt;   &lt;a href=&quot;/wiki/index.php?title=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:Android&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Категория:Android (страница не существует)&quot;&gt;Категория:Android&lt;/a&gt;    &amp;#039;&amp;#039;&amp;#039;Ваши программные наработки не проп…»&lt;/p&gt;
&lt;a href=&quot;http://wiki.linuxformat.ru/wiki/index.php?title=LXF157:ARM_%D0%B8_Android:%D0%9F%D1%80%D0%BE%C2%AD%D0%B3%D1%80%D0%B0%D0%BC%C2%AD%D0%BC%D0%B8%C2%AD%D1%80%D0%BE%C2%AD%D0%B2%D0%B0%C2%AD%D0%BD%D0%B8%D0%B5&amp;amp;diff=17265&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	</feed>