<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Intel Software Network Blog - Russia</title>
	
	<link>http://software.intel.com/ru-ru/blogs</link>
	<description />
	<lastBuildDate>Wed, 16 May 2012 13:17:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ISNBlogRussia" /><feedburner:info uri="isnblogrussia" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>ISNBlogRussia</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Сенсоры грядут</title>
		<link>http://feedproxy.google.com/~r/ISNBlogRussia/~3/DqWnZQubRyE/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2012/05/16/2007561/#comments</comments>
		<pubDate>Wed, 16 May 2012 13:17:28 +0000</pubDate>
		<dc:creator>Dmitry Rizshkov</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Ultrabook]]></category>
		<category><![CDATA[Ultrabooks]]></category>
		<category><![CDATA[Мобильность]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[sensors]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2012/05/16/2007561/</guid>
		<description><![CDATA[На прошедшем недавно Intel Developer Forum 2012 в Пекине компания Intel и ее партнеры продемонстрировали новые ультрабуки, одной из отличительных особенностей которых (не считая дизайна и наличия сенсорного экрана) является наличие сенсоров. Причем, данные модели не просто концептуальный дизайн, они являются образцами реальных устройств, которые начнут появляться на рынке в ближайшее время. С их появлением [...]]]></description>
			<content:encoded><![CDATA[<p>На прошедшем недавно <a href='http://www.intel.com/content/www/us/en/intel-developer-forum-idf/idf-2012.html'>Intel Developer Forum 2012</a> в Пекине компания Intel и ее партнеры продемонстрировали новые ультрабуки, одной из отличительных особенностей которых (не считая дизайна и наличия сенсорного экрана) является наличие сенсоров. </p>
<p align="center">
<img src='http://img-fotki.yandex.ru/get/6211/30671174.3/0_75353_62e61613_orig' />
</p>
<p>Причем, данные модели не просто концептуальный дизайн, они являются образцами реальных устройств, которые начнут появляться на рынке в ближайшее время. С их появлением и широким распространением сенсоры больше не будут считаться диковинкой, а станут неотъемлемой частью любого ультрабука.</p>
<h2>Виды сенсоров</h2>
<p>Не берусь говорить точно о том, какие именно датчики будут устанавливаться, но скорее всего в стандартный набор будут входить:</p>
<ul>
<li>Датчик освещенности</li>
<li>Акселерометр</li>
<li>Компас</li>
<li>Датчик ориентации</li>
<li>GPS</li>
</ul>
<h2>Зачем они нужны</h2>
<p>Их наличие может дать пользователю возможность использовать навигацию, работать с умными, контекстно-зависимыми приложениями, а также новые возможности по взаимодействию с интерфейсом пользователя, новый класс игр и многое другое.<br />
Для программиста это возможность добавить в свое приложение функции, отличающие программу от продуктов конкурентов, а то и вовсе возможность найти и "застолбить" новую модель использования. Тема пока новая, у каждого разработчика есть шанс создать что-то, что станет "классикой жанра".</p>
<p>Благо предпосылки к созданию программ, работающих с сенсорами, появились еще в Windows 7 -  <a href='http://msdn.microsoft.com/en-us/library/windows/hardware/gg463473.aspx'>Sensor and Location Platform</a>. Это унифицированный интерфейс взаимодействия с сенсорами, который позволяет избежать неразберихи, когда каждый датчик поставлялся со своими драйверами и своим API. </p>
<h2>Как начать использовать сенсоры уже сейчас</h2>
<p>С софтом разобрались, теперь про железо - ультрабуков с сенсорами на борту на рынке пока нет. Что делать, если уже чешутся руки попрактиковаться и создать что-то новое, уникальное?</p>
<p>Существуют два варианта:</p>
<ul>
<li>Использовать сторонний датчик (набор сенсоров), например, от Freescale или STMicroelectronics</li>
<li>Использовать датчики, которые уже есть, практически у каждого - сенсоры смартфона</li>
</ul>
<p>Далее я как раз и хочу рассказать о втором пункте, на примере использования смартфона на базе ОС Android в качестве «донора» данных.</p>
<p>Однажды, в поисках подобного решения я наткнулся на интересное приложение - <a>PCRemote</a>, которое представляет из себя программу для удаленного управления компьютером с помощью устройств, работающих под Android. В сети полно подобных проектов, но этот оказался интересным потому, что предлагал использовать не только сенсорный экран (как множество других проектов) для управления компьютером, но и акселерометр, компас, гироскоп. Причем поддержка сенсоров организована таким образом, что после установки всего необходимого софта в системе появляются реальные "виртуальные" сенсоры. Windows их "видит" как обычные датчики, подключенные (интегрированные) к компьютеру, благодаря этому работа с ними возможна посредством стандартного API из состава <a href='http://msdn.microsoft.com/en-us/library/windows/hardware/gg463473.aspx'>Sensor and Location Platform</a>.</p>
<p>Данное решение поддерживает:</p>
<ul>
<li>GPS</li>
<li>Акселерометр</li>
<li>Датчик ориентации</li>
<li>Датчик освещенности</li>
</ul>
<p>Огромным плюсом использования этого решения является то, что после того как на замену "виртуальным" сенсорам придут "реальные, железные", разработчику не нужно будет ничего менять, т.к. взаимодействие с датчиками останется прежним, на уровне Sensor and Location Platform API.</p>
<h2>Как установить</h2>
<p>Первое, что необходимо сделать, это перейти на страницу <a href='http://feishare.com/android/remotesensors'>RemoteSensors</a> и скачать RemoteSensors driver for Windows 7. На сайте представлены драйвера для 32-х и 64-х систем. Скачиваем, запускаем установку, следуем подсказкам. </p>
<p>После завершения установки идем в панель управления, раздел <i>Hardware and Sound</i>, далее <i>Location and Other Sensors</i>.</p>
<p align="center">
<img src='http://img-fotki.yandex.ru/get/6304/30671174.3/0_753c3_e4043663_orig' align='center' />
</p>
<p>Ставим галочку (<i>Enabled</i>) напротив PcRemote Sensors Device и нажимаем <i>Apply</i>.</p>
<p align="center">
<img src='http://img-fotki.yandex.ru/get/6305/30671174.3/0_753c4_73ec38d3_orig' align='center' />
</p>
<p>В системе появились сенсоры. Осталось привязать их показания к показаниям сенсоров смартфона. Для этого скачиваем приложение <a href='http://feishare.com/android/pcremote'>PCRemoteServer</a> и запускаем его.</p>
<p align="center">
<img src='http://img-fotki.yandex.ru/get/6211/30671174.3/0_75311_ad77c90b_orig' align='center' />
</p>
<p>Последний шаг - через Google Play скачиваем и устанавливаем приложение <a href='https://play.google.com/store/apps/details?id=org.linknet.pcremote&amp;hl=ru'>PcRemote Advance</a>.</p>
<p align="center">
<img src='http://img-fotki.yandex.ru/get/6110/30671174.3/0_7535f_a0e76d0d_orig' align='center' />
</p>
<p>Запускаем, выбираем пункт <i>Discovery Server</i>, после того, как сервер обнаружен и произошло подключение - выбираем пункт - <i>Sensors to PC</i>.</p>
<p align="center">
<img src='http://img-fotki.yandex.ru/get/6302/30671174.3/0_75360_c6e87e9_orig' align='center' />
</p>
<p>Готово! Наш ПК (ноутбук, ультрабук, нетбук) теперь имеет сенсоры!</p>
<p>Как проверить работоспособность данного решения? Для этого я написал простое приложение, которое при запуске инициализирует <a href='http://msdn.microsoft.com/en-us/library/windows/hardware/gg463473.aspx'>Sensor and Location Platform</a>, перечисляет все сенсоры, доступные в системе и выводит их в виде списка (<i>Sensors</i>). При выборе сенсора в списке в нижней части окна (<i>Values</i>) можно видеть текущие показания сенсоров.</p>
<p align="center">
<img src='http://img-fotki.yandex.ru/get/6300/30671174.3/0_75362_4249198c_orig' align='center' />
</p>
<p>Если все было сделано правильно, то при запуске приложения вы увидите список как на картинке. </p>
<p>Теперь можно смело приступать к разработке сенсоро-ориентированного приложения для новых мобильных платформ.</p>
<p>Если у вас остались вопросы о том как использовать сенсоры в своих приложениях - приходите послушать доклады, посвященные сенсорам на <a href='http://software.intel.com/ru-ru/articles/intel-at-KRI-2012/'>КРИ</a> и <a href='http://www.msdevcon.ru/'>DevCon 12</a>.</p>
<img src="http://feeds.feedburner.com/~r/ISNBlogRussia/~4/DqWnZQubRyE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2012/05/16/2007561/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://software.intel.com/ru-ru/blogs/2012/05/16/2007561/</feedburner:origLink></item>
		<item>
		<title>Коллекция интересных ресурсов по тематике программирования на языке Си/Си++</title>
		<link>http://feedproxy.google.com/~r/ISNBlogRussia/~3/KbOussaVqrc/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2012/05/16/2007556/#comments</comments>
		<pubDate>Wed, 16 May 2012 09:13:49 +0000</pubDate>
		<dc:creator>Andrey Karpov</dc:creator>
				<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[си плюс плюс]]></category>
		<category><![CDATA[Си++]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2012/05/16/2007556/</guid>
		<description><![CDATA[Если вы присутствуете на одном из этих сайтов, то приглашаю следовать за мной. Со временем вам попадется немало интересных статей. А чтобы заинтересовать вас, я решил сделать небольшую подборку материалов.]]></description>
			<content:encoded><![CDATA[<p>Я постоянно изучаю интернет на тему новых статей про программированию на языке Си/Си++/Си++11. Если мне они кажутся интересными, я делюсь ссылками на них в твиттере <a href="https://twitter.com/Code_Analysis" target="_blank">@Code_Analysis</a>, в реддите <a href="http://www.reddit.com/r/viva64/" target="_blank">/r/Viva64</a> и голосую в <a href="http://www.stumbleupon.com/stumbler/AndreyKarpov2010" target="_blank">StumbleUpon</a>. Если вы присутствуете на одном из этих сайтов, то приглашаю следовать за мной. Со временем вам попадется немало интересных статей. А чтобы заинтересовать вас, я решил сделать небольшую подборку материалов.</p>
<p>В первую очередь я, конечно, хочу порекомендовать наш сайт viva64.com. Здесь можно найти много <a href="http://www.viva64.com/ru/articles/">статей</a> и записей в <a href="http://www.viva64.com/ru/b/">блоге</a>, касающихся разработке качественного кода. Например, предлагаю познакомиться с <a href="http://www.viva64.com/ru/l/">28 уроками</a>, посвященными разработке 64-битных приложений на языке Си/Си++.</p>
<p>Для удобства я разбил ссылки на несколько тем. Желаю приятного чтения.</p>
<p><i>Примечание. Как правило, мы оборачиваем ссылки, чтобы контролировать их целостность. Про это бесстрашное сражение с хаосом, я писал в статье "<a href="http://www.viva64.com/ru/b/0075/"><i>Д'Артаньян и интернет, или работа над проблемой битых ссылок</i></a>". К сожалению, в этот раз я буду давать прямые ссылки. Эти материалы существенно увеличат базу ссылок, а значит, существенно прибавят нам работы в случае перемещения статей.</i></p>
<h2>Си++ живее всех живых</h2>
<ul>
<li>Большой список известных проектов, которые разрабатываются на языке Си/Си++: <a href="http://www2.research.att.com/~bs/applications.html" target="_blank">C++ Applications</a>. И после этого кто-то говорит, что язык Си++ вымирает?</li>
<li><a href="http://shootout.alioth.debian.org/u32/which-programming-languages-are-fastest.php" target="_blank">Computer Language Benchmarks Game</a>. Как всегда по скорости лидируют языки Fortran, Си и Си++. И вряд ли что-то в обозримом времени изменится. Если вы разрабатываете ресурсоемкое программное обеспечение, то Си++ может оказаться оптимальным выбором.</li>
<li><a href="http://quant.stackexchange.com/questions/1764/why-is-c-still-a-very-popular-language-in-quantitative-finance">Why is C++ still a very popular language in quantitative finance?</a></li>
<li><a href="http://lambda-the-ultimate.org/node/663">Why do they program in C++?</a></li>
<li><a href="http://www.cpprocks.com/2012/05/07/9-reasons-to-start-using-c11/">9 reasons to start using C++11</a></li>
</ul>
<h2>Интересные блоги</h2>
<ul>
<li><a href="http://stevehanov.ca/blog/" target="_blank">Steve Hanov's Blog</a></li>
<li><a href="http://blogs.msdn.com/b/vcblog/" target="_blank">Visual C++ Team Blog</a></li>
<li><a href="http://blogs.msdn.com/b/oldnewthing/" target="_blank">The Old New Thing</a></li>
</ul>
<h2>Арифметика с плавающей запятой</h2>
<ul>
<li><a href="http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html">What Every Computer Scientist Should Know About Floating-Point Arithmetic</a></li>
<li><a href="http://randomascii.wordpress.com/2012/01/11/tricks-with-the-floating-point-format/">Tricks With the Floating-Point Format</a></li>
<li><a href="http://www.altdevblogaday.com/2012/01/21/stupid-float-tricks/" target="_blank">Stupid Float Tricks</a></li>
<li><a href="http://www.altdevblogaday.com/2012/02/22/comparing-floating-point-numbers-2012-edition/" target="_blank">Comparing Floating Point Numbers</a>, 2012 Edition</li>
</ul>
<h2>Разные приёмы при программировании</h2>
<ul>
<li><a href="http://graphics.stanford.edu/~seander/bithacks.html" target="_blank">Bit Twiddling Hacks</a></li>
<li><a href="http://www.macieira.org/blog/2011/07/table-driven-methods-with-no-relocations/">Table-driven methods with no relocations</a></li>
<li><a href="">Reduce Compilation Dependencies</a> in Large Scale C++ Projects: Factory Pattern</li>
<li><a href="http://www.di.unipi.it/~nids/docs/longjump_try_trow_catch.html">Exceptions in C with Longjmp and Setjmp</a></li>
<li>Catching Integer Overflows in C. Article <a href="http://www.fefe.de/intof.html">N1</a>, <a href="">N2</a></li>
<li><a href="http://www.endofunctor.org/~rpearl/blog/cool-c-tricks.html" target="_blank">Cool C Tricks</a></li>
</ul>
<h2>О кодировках символов и управляющих символах</h2>
<ul>
<li><a href="http://triptico.com/docs/unicode.html">Unicode, UTF-8 and all that</a>: An intentionally incomplete character set introduction for hasty C programmers</li>
<li><a href="http://code.alexreisner.com/articles/character-encoding.html">What the xxxx Is UTF-8?</a> A Character Encoding Primer.</li>
<li><a href="http://www.oocities.org/dtmcbride/tech/charsets/ascii.html" target="_blank">ASCII Characters</a></li>
<li><a href="http://en.wikipedia.org/wiki/Control_character" target="_blank">Control character</a></li>
<li>The <a href="http://www.utf8everywhere.org/" target="_blank">UTF-8 Everywhere</a> manifesto</li>
</ul>
<h2>Стандарты кодирования</h2>
<ul>
<li><a href="http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml" target="_blank">Google C++ Style Guide</a></li>
<li>CERT. <a href="https://www.securecoding.cert.org/confluence/display/seccode/CERT+C+Secure+Coding+Standard">C Secure Coding Standard</a>, <a href="">C++ Secure Coding Standard</a></li>
<li><a href="http://www2.research.att.com/~bs/JSF-AV-rules.pdf">Joint Strike Fighter (F-35) C++ Coding Standard</a></li>
</ul>
<h2>Группы</h2>
<ul>
<li>Reddit: <a href="http://www.reddit.com/r/cpp/" target="_blank">Cpp</a>, <a href="http://www.reddit.com/r/C_Programming/" target="_blank">C_Programming</a>.</li>
<li>Facebook: <a href="http://www.facebook.com/groups/CPPProgramming/">C++ Programming</a>, <a href="">For the love of C++</a>, <a href="http://www.facebook.com/groups/11366002065/">C Programming</a>, <a href="http://www.facebook.com/groups/2248174480/">Visual C++ Developer</a>, <a href="http://www.facebook.com/groups/2204920930/">C Plus Plus (C++)</a></li>
<li>LinkedIN: <a href="http://www.linkedin.com/groups?home=&amp;gid=133720&amp;trk=anet_ug_hm">C++ Community Group</a>, <a href="http://www.linkedin.com/groups?home=&amp;gid=87434&amp;trk=anet_ug_hm">C++ Developers Forum</a>, <a href="">C++ Developers Group</a>, <a href="http://www.linkedin.com/groups?home=&amp;gid=100895&amp;trk=anet_ug_hm">C++ Professionals</a></li>
</ul>
<h2>Разное</h2>
<ul>
<li><a href="http://www.conifersystems.com/whitepapers/gnu-make/">What's Wrong With GNU make?</a></li>
<li>Почему strncpy не безопаснее strcpy: <a href="http://blog.liw.fi/posts/strncpy/">strncpy? just say no</a></li>
<li>A Guide to Undefined Behavior in C and C++. Part <a href="http://blog.regehr.org/archives/213" target="_blank">N1</a>, <a href="http://blog.regehr.org/archives/226" target="_blank">N2</a>, <a href="http://blog.regehr.org/archives/232" target="_blank">N3</a></li>
<li>Компиляция 64-битных приложений в Visual C++ 2008 Express Edition. <a href="http://jenshuebel.wordpress.com/2009/02/12/visual-c-2008-express-edition-and-64-bit-targets/" target="_blank">Visual C++ 2008 Express Edition And 64-Bit Targets</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/aa290049%28VS.71%29.aspx">Windows Data Alignment on IPF, x86, and x64</a></li>
<li>C/C++ Low Level Curriculum. Part <a href="http://www.altdevblogaday.com/2011/11/09/a-low-level-curriculum-for-c-and-c/">N1</a>, <a href="http://www.altdevblogaday.com/2011/11/24/c-c-low-level-curriculum-part-2-data-types/">N2</a>, <a href="">N3</a>, <a href="http://www.altdevblogaday.com/2011/12/24/c-c-low-level-curriculum-part-4-more-stack/">N4</a>, <a href="">N5</a>, <a href="http://www.altdevblogaday.com/2012/03/07/c-c-low-level-curriculum-part-6-conditionals/">N6</a>, <a href="http://www.altdevblogaday.com/2012/04/10/cc-low-level-curriculum-part-7-more-conditionals/">N7</a>, <a href="">N8</a></li>
<li>Ссылки на различные ресурсы по тематике Си++. <a href="Internet%20sites%20and%20files%20of%20interest%20to%20C++%20users">Список</a> ссылается на много старых ресурсов, но его стоит посмотреть.</li>
<li><a href="http://www.altdevblogaday.com/2012/04/26/functional-programming-in-c/" target="_blank">Functional Programming in C++</a></li>
<li><a href="http://goldns.ru/cppmap-2012.png" target="_blank">The C++ Lands</a> (забавная картинка)</li>
<li><a href="http://www.cdecl.org/" target="_blank">Translate</a> C declaration</li>
<li><a href="http://dashmorethan.wordpress.com/2012/03/26/arbitrary-data-sizes/" target="_blank">Arbitrary Data Sizes with C</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/ISNBlogRussia/~4/KbOussaVqrc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2012/05/16/2007556/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://software.intel.com/ru-ru/blogs/2012/05/16/2007556/</feedburner:origLink></item>
		<item>
		<title>Встраиваемые функции (inline) для тех, кто не знает, и для тех, кто забыл...</title>
		<link>http://feedproxy.google.com/~r/ISNBlogRussia/~3/spamPr7Smko/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2012/05/16/inline/#comments</comments>
		<pubDate>Wed, 16 May 2012 08:12:01 +0000</pubDate>
		<dc:creator>tourmaline</dc:creator>
				<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[Acceler8]]></category>
		<category><![CDATA[accelerate 2012]]></category>
		<category><![CDATA[inline функции]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2012/05/16/inline/</guid>
		<description><![CDATA[Помещение аргументов в стек, передача управления функции и возврат из нее, освобождение стека - все это вносит издержки, которые немного, но влияют на скорость. Можно получить выигрыш во времени, если дать компилятору копировать код функции непосредственно в код программы по месту вызова, а не создавать функцию в памяти. Такие функции называются встраиваемые (inline). Тривиальный пример [...]]]></description>
			<content:encoded><![CDATA[<p>Помещение аргументов в стек, передача управления функции и возврат из нее, освобождение стека - все это вносит издержки, которые немного, но влияют на скорость. Можно получить выигрыш во времени, если дать компилятору копировать код функции непосредственно в код программы по месту вызова, а не создавать функцию в памяти. Такие функции называются встраиваемые (inline).</p>
<p><em>Тривиальный пример вызова встраиваемой функции:</em></p>
<pre name="code" class="cpp">inline int sum(int a, int b)
{
   return a+b;
}

int main()
{
   int a = 2, b = 5, с;
   c = sum(a, b);     // c = a+b
}</pre>
<p>Следует отметить, что inline - лишь рекомендация, а не команда компилятору заменять вызов функции ее телом. Он может подсчитать встраивание нецелесообразным и просто проигнорировать модификатор inline и трактовать функцию как обычную. Так что как говорится, на все воля компилятора... (<em>прим</em>.: на Windows существует модификатор <code>__forceinline</code>, который заставляет компилятор встроить функцию)</p>
<p><strong>Почему иногда лучше проигнорировать модификатор inline?</strong><br />
 Посмотрим как встраиваемые функции могут влиять на некоторые характеристики программы.</p>
<p><em><strong>Скорость:</strong></em></p>
<ul>
<li><em>быстрее </em>- внедрение кода функции в код программы поможет избежать использования лишних инструкций (связанных с вызовом функции и возвратом из нее)</li>
<li><em>медленнее </em>- слишком частое использование встраиваемых функций, к тому же больших, приведет к разрастанию кода (помимо этого, компилятор иногда вынужден использовать дополнительные временные переменные, чтобы сохранить семантику), что может привести в пробуксовке, т.е. в процессе работы программы операционной системе постоянно потребуется производить подкачку новых страниц</li>
</ul>
<p><em><strong>Размер исполняемого файла:</strong></em></p>
<ul>
<li><em>увеличить </em>- как уже упоминалось, слишком частое использование встраиваемых функций, к тому же больших, приведет к разрастанию кода и соответственно увеличению размера исполняемого файла</li>
<li><em>уменьшить </em>- благодаря оптимизирующему компилятору размер исполняемого файла может и уменьшиться при использовании очень маленьких встраиваемых функций, так как компилятору при этом не нужно будет создавать "лишние" инструкции для вызова функции и выхода из нее, помещению аргументов в стек и обратно. Так же во время внедрения большой встраиваемой функции в код программы оптимизирующий компилятор может удалить избыточный код, что опять же может уменьшить размер файла.</li>
</ul>
<p><em><strong>Пробуксовка (thrashing):</strong></em></p>
<ul>
<li><em>увеличить </em>- слишком частое использование встраиваемых функций, к тому же больших, приведет к разрастанию кода, что может привести в пробуксовке, т.е. в процессе работы программы операционной системе постоянно потребуется производить подкачку новых страниц</li>
<li><em>уменьшить </em>- может уменьшить количество страниц виртуальной памяти, которые должны быть в оперативной памяти одновременно. Например, когда функция <code>f()</code> вызывает функцию <code>g()</code>, коды функций, скорее всего, находятся на разных страницах виртуальной памяти, при внедрении компилятором кода функции <code>g()</code> в код функции <code>f()</code>, часто код обеих функций находится на одной странице</li>
</ul>
<p><strong>Multiply defined</strong><br />
Компилятор может вставить тело функции в код лишь в том случае, если ее тело находится в текущей единице трансляции. Таким образом, встраиваемые функции должны быть определены в каждой единице трансляции, где они используются, что очень не нравится компоновщику.<br />
Для решения этой проблемы были созданы так называемые слабые (weak) символы. Как только компоновщик найдет один из таких символов, остальные будут проигнорированы. Даже если компилятор проигнорирует модификатор, компоновка пройдет успешно.<br />
Благодаря модификатору <strong>inline</strong>? символ функции становится <strong>слабым символом</strong>, поэтому смело можно ставить встраиваемую функцию в один <code>*.h</code>-файл и использовать его в различных единицах трансляции.<br />
<em>Пример</em>:</p>
<pre name="code" class="cpp">// test.cpp
#include "my.h"
int main()
{
  int x = 1, y = 1;
  my(x, y);

  return 0;
}

// test1.cpp
#include "my.h"
void f()
{
  int x = 1, y = 1;
  my(x, y);
}

// my.h
inline void my(int x, int y)
{
  x+y;
}</pre>
<p><code>g++ test.cpp -c<br />
g++ test1.cpp -c<br />
g++ test.o test1.o -o // без inline возникает ошибка "multiple definition"</code></p>
<p><strong>Хорошо, а что с макросами?</strong><br />
Заметим, что макросы обрабатываются препроцессором, а inline-функции компилятором. Так как макросы не видны компилятору, их сложнее отлаживать.<br />
Встраиваемые функции знают об области видимости и делают проверку типа в отличие от макросов.<br />
Встраиваемые функции могут быть перегруженными, функциями-членами классов, задаваться шаблонами и обладают другими достоинствами, недоступными макросам.</p>
<p><strong>Кто знает о модификаторе Inline?</strong><br />
Модификатор поддерживается стандартами C++, C99, GNU C. Причем везде работа с модификатором различна.</p>
<p><strong>Итак,</strong><br />
1) при уместном использовании встраиваемые функции могут повысить скорость выполнения и уменьшить размер исполняемого файла.<br />
2) Могут (и должны) быть определены в разных единицах трансляции<br />
3) Чтобы встраиваемая функция давала существенный выигрыш по сравнению с обычной функцией, она должна быть небольшого размера.<br />
4) Компилятор все равно сделает все по своему, модификатор inline лишь подсказка. Он может проигнорировать модификатор там, где он есть, и поставить там, где его нет.</p>
<p><strong>Основная литература</strong><br />
<a href="http://www.parashift.com/c++-faq/inline-functions.html">http://www.parashift.com/c++-faq/inline-functions.html</a><br />
<a href="http://alenacpp.blogspot.com/2005/01/blog-post_28.html">http://alenacpp.blogspot.com/2005/01/blog-post_28.html</a><br />
<a href="http://stackoverflow.com">http://stackoverflow.com</a><br />
<a href="www.intuit.ru/">www.intuit.ru/</a></p>
<img src="http://feeds.feedburner.com/~r/ISNBlogRussia/~4/spamPr7Smko" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2012/05/16/inline/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://software.intel.com/ru-ru/blogs/2012/05/16/inline/</feedburner:origLink></item>
		<item>
		<title>Тестирование видеокодеков. Эпизод II: энкодеры атакуют</title>
		<link>http://feedproxy.google.com/~r/ISNBlogRussia/~3/afIOyPDg8HE/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2012/05/16/ii-3/#comments</comments>
		<pubDate>Wed, 16 May 2012 06:10:01 +0000</pubDate>
		<dc:creator>Andrey Maslennikov (Intel)</dc:creator>
				<category><![CDATA[Графика]]></category>
		<category><![CDATA[Media SDK]]></category>
		<category><![CDATA[видеокодеки]]></category>
		<category><![CDATA[тестирование]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2012/05/16/ii-3/</guid>
		<description><![CDATA[Это перепост статьи с habrahabr.ru. Ссылка на первую часть. Сразу хочется отметить, что энкодеры это не декодеры, предопределенных наборов видеопоследовательностей, на которых принято тестироваться, здесь нет, что с самого начала усложняет весь процесс. Но есть общеупотребимые, обычно именно на них доказывают превосходство одних кодеков (или их реализаций) над другими. Замечательные сравнения делают ребята из МГУ, [...]]]></description>
			<content:encoded><![CDATA[<p>Это перепост статьи с <a href="http://habrahabr.ru/company/intel/blog/143393/">habrahabr.ru</a>.</p>
<p><a href="http://habrahabr.ru/company/intel/blog/142187/">Ссылка</a> на первую часть.</p>
<p>Сразу хочется отметить, что энкодеры это не декодеры, предопределенных наборов видеопоследовательностей, на которых принято тестироваться, здесь нет, что с самого начала усложняет весь процесс. Но есть общеупотребимые, обычно именно на них доказывают превосходство одних кодеков (или их реализаций) над другими.</p>
<blockquote><p>Замечательные сравнения делают ребята из МГУ, посмотреть можно тут: <a href="http://compression.ru">compression.ru</a></p></blockquote>
<p>Если говорить о сравнении, то можно выделить два критерия: качество (субъективное или объективное) и производительность. Редкий кодек способен победить в обеих номинациях сразу. Однако, речь пойдет о тестировании энкодеров.<br />
Итак, на входе у нас разжатое видео и реализация какого-нибудь кодека (собственно энкодер), на выходе – сжатый клип. Немного про входные данные мы уже поговорили выше, но хочется отметить, что ограничены мы лишь своей фантазией и... лицензиями. Т.е. всегда можно снять видео самому и потом с помощью него издеваться над декодером/энкодером, и не всегда можно скачать кино из интернета для тех же целей. Кроме того, бывает полезно создавать искусственные последовательности: шумы, кадры одного цвета и т.д.<br />
После длительного процесса сжатия мы получим строгими спецификациями выверенный сжатый поток. В нем есть почти все, что было в исходных данных (мы ведь про сжатие с потерями). Именно этот файл нам и предстоит исследовать. И раз уж речь зашла о спецификациях, то одна из важных проверок будет заключаться в том, чтобы убедиться, что наш клип соответствует стандарту.</p>
<blockquote><p>Это лучше делать сторонними инструментами - так доверие к оценке выше для сторонних пользователей.</p></blockquote>
<p>Но инициатива не всегда наказуема: есть желание - можно и самим разобрать файл на составляющие и все перепроверить. Это следует делать еще и для того, чтобы удостовериться, что наш энкодер записал все параметры так, как мы хотели, а не как попало. Разумеется, в данном случае мы ограничены “ручками”, которые мы можем “подергать” в настройках энкодера.</p>
<blockquote><p>Любителям x264 придется смириться с меньшим количеством переключателей</p></blockquote>
<p>Но вернемся к нашему закодированному файлу. Как оценить качество картинки, которую увидит пользователь? Все очень похоже на то, что было в первой части: нам нужен декодер,<br />
желательно сторонний, референсный, чтобы избежать двойных ошибок<br />
с помощью которого мы получим разжатую видеопоследовательность, которую сможем сравнить с исходной с помощью уже знакомых нам метрик - PSNR и SSIM.<br />
Однако, здесь мы приходим к важному вопросу: какие должны быть пороги “похожести” видео? Иначе говоря, какие значения PSNR/SSIM нас удовлетворят, а какие нет? В общем случае, хорошо - это когда не плохо, т.е. нет артефактов, искажений и всего прочего, что так не нравится глазу. И хорошо, если наши метрики это уловили. Не забудем записать нужную циферку в тайное место и использовать при следующей проверке - а вдруг что-то сломалось. Но вот “сломаться” может по-разному.<br />
Итак, допустим вчера наш энкодер давал X dB при Y битрейте (кодировать будем с постоянным битрейтом)</p>
<blockquote><p>все остальные параметры мы учитывать не будем, оставим их фиксированными</p></blockquote>
<p>сегодня наш же энкодер выдает X1 dB при том же битрейте. В чем дело? Бьем тревогу? Минуту, а X1 больше X? Если так, то все хорошо, энкодер стал работать лучше! Или нет? Не все так просто, как хотелось бы: при использовании постоянного битрейта нет гарантии, что он и правда будет постоянным - возможны небольшие отклонения (в обе стороны). Теперь представим, что якобы возросшее качество объясняется возросшим битрейтом. А это значит, что никакого реального улучшения нет: энкодер “схитрил”, забрав побольше бит, которые и использовал для улучшения качества. Так же и уменьшение значения X1 по сравнению с X не говорит об ухудшении энкодера - может, он нам битов сэкономил. Мораль: больше не значит лучше, меньше не значит хуже.<br />
<img src="http://habrastorage.org/storage2/d1a/c5a/441/d1ac5a44114b29a30ffba84c85af2fa8.png" alt="" /></p>
<p>Но что мы все о качестве картинки? Пора и про декодеры подумать, им же потом всю эту закодированную муть разбирать. Положил ли энкодер все нужные параметры в поток? Правильно ли он их положил? Соблюдал ли все требования и предписания в стандарте описанные?</p>
<blockquote><p>Все это и многое другое необходимо проверить, перепроверить, а затем уточнить. И так каждый раз, с каждым энкодером. Но мы об этом уже немного говорили, заострять внимание не будем</p></blockquote>
<p>И вроде бы все, можно закончить на этом, но есть одно но: у нас же SDK! А значит, что все варианты работы с памятью, потоками и еще всем, что пользователю доступно изменять, надо проверить. В теории, в большинстве случаев, все способы использования SDK должны давать один и тот же результат.</p>
<blockquote><p>ну правда, почему качество должно пострадать, если пользователь использует D3D память, вместо системной? Или глубину асинхронности поменяли. Или потоков решили побольше (или поменьше) использовать.</p></blockquote>
<p>А значит, мы можем очень хорошо протестировать некоторую наиболее используемую модель, а остальные сравнивать с ней. Так будет быстрее, ведь операции декодирования (для получения сырого видео) и  подсчета метрик (как раз на основе сырых файлов) дешевыми не назовешь.</p>
<p>Подводя итог, хочется отметить, что если при тестировании декодера нам наиболее интересны входные данные (и чем разнообразнее, тем лучше), то при тестировании энкодеров важно все: и входные данные, и параметры кодирования, коих может быть очень и очень много. Да и сами проверки во втором случае должны быть более интеллектуальными.</p>
<img src="http://feeds.feedburner.com/~r/ISNBlogRussia/~4/afIOyPDg8HE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2012/05/16/ii-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://software.intel.com/ru-ru/blogs/2012/05/16/ii-3/</feedburner:origLink></item>
		<item>
		<title>Несколько мыслей о прогрессе, прекрасном и неумолимом</title>
		<link>http://feedproxy.google.com/~r/ISNBlogRussia/~3/GOVBXDXohD8/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2012/05/15/2007432/#comments</comments>
		<pubDate>Tue, 15 May 2012 09:13:52 +0000</pubDate>
		<dc:creator>vilianov</dc:creator>
				<category><![CDATA[Ultrabook]]></category>
		<category><![CDATA[Ultrabooks]]></category>
		<category><![CDATA[Мобильность]]></category>
		<category><![CDATA[Управляемость]]></category>
		<category><![CDATA[progress]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2012/05/15/2007432/</guid>
		<description><![CDATA[В середине девяностых годов прошлого века мой любимый журнал «Компьютерра» регулярно поднимал тему влияния Интернета на повседневную жизнь людей. Помнится, по достижению средней скорости домашнего канала скорости в 256 килобит обещалось всеобщее видеообщение  и просто неограниченные возможности для удаленной работы. Действительно, легкий и быстрый доступ в Сеть со временем подарил нам много новых возможностей. Но мне иногда хочется, чтобы некоторые он забрал обратно.]]></description>
			<content:encoded><![CDATA[<p>В середине девяностых годов прошлого века мой любимый журнал «Компьютерра» регулярно поднимал тему влияния Интернета на повседневную жизнь людей. Помнится, по достижению средней скорости домашнего канала скорости в 256 килобит обещалось всеобщее видеообщение  и просто неограниченные возможности для удаленной работы. Действительно, легкий и быстрый доступ в Сеть со временем подарил нам много новых возможностей. Но мне иногда хочется, чтобы некоторые он забрал обратно.</p>
<p>Ох уж эти заветные 256 килобит! Какими недостижимыми они казались, когда мы кое-как подключались к провайдеру через старую аналоговую АТС, и кое-как соединялись на скорости 14400 или, если повезет, 18600. Пара килобайт в секунду прокачивается – и уже отлично! При этом у самого «крутого» саратовского провайдера ширина канала на Москву равнялась <em>мегабиту</em>. У остальных – поменьше. У кого в два раза, а у кого и в четыре.</p>
<p>Но вот быстрый Интернет действительно стал обыденностью. Его отсутствие вызывает  раздражение – словно отключили горячую воду или забыли подать ток в розетку. Даже в дальнем зарубежье войти в Сеть не составляет никакого труда. Не в гостинице, так в кафе. Не в кафе, так через местную сим-карту. Ну и просто можно встать около жилого дома и посканировать эфир: почти наверняка найдется ретроград, не желающий настраивать шифрование WiFi у своего роутера.</p>
<p>Что до устройств, способных выходить в Сеть, то с ними у нас все просто замечательно. Смартфон, планшет, ноутбук – это уж наверняка. Иногда им на помощь приходят еще умные плееры и портативные игровые консоли. Пара кликов – и вот они, любимые почта, мессенджер, Facebook да Twitter. Все знакомые здесь, словно ты и не уезжал никуда (<em>кстати, это «словно никуда не уезжал» работает и в другую сторону. Недавно прикинули с другом, давно живущим в Китае, сколько же мы с ним не виделись. Оказалось – не меньше пяти лет. При этом ощущения разлуки нет никакого, потому что мы почти каждый день общаемся по ICQ и почте</em>). Помню, поначалу меня это ощущение очень радовало – надо же, чувствуешь себя дома по всему миру. Но вот в последние годы меня это ощущение стало почему-то раздражать…</p>
<p>Нет, дело не в острой форме мизантропии. Просто вместе с «чувством дома» Интернет приносит чувство долга. Ведь мой ноутбук (простите, UltraBook ™) представляет собой абсолютно полноценное рабочее место. Я могу на нем отвечать на письма, писать статьи, обрабатывать фотографии… А раз могу – то и делаю. Помнится, раньше, побыв свидетелем какого-то IT-события, я шел заниматься своими делами, и уже по возвращению домой писал статью. Теперь же я пишу ее ночью, чтобы как можно скорее опубликовать на сайте. Отдельное «спасибо» цифровой фотографии: снимки готовы для обработки сразу, без необходимости вмешательства фотолаборатории. И нашему брату-трудоголику никак нельзя лечь спать, пока лучшие двадцать-тридцать кадров не попадут в заботливые руки коллег… </p>
<p>И ладно бы ограничивалось недосыпом из-за желания поведать о чем-то интересном. В конце концов, это работа, причем – любимая. Но ведь в почте регулярно обнаруживаются напоминания о делах скучных, рутинных, а иногда и попросту неприятных. И, честно говоря, с ними я бы предпочел не сталкиваться до возвращения домой. Но – не могу.</p>
<p>Все мы сейчас напоминаем эдаких гребцов, прикованных к галерам. Разве что галеры у нас довольно изящные, и обычно мы их подбираем себе сами. Добавить еще к Интернету постоянно работающий мобильник («спасибо» подешевевшему роумингу), и причины неуклонного роста благосостояния врачевателей неврозов становятся очевидными.</p>
<p>Как журналист и просто любитель техники я аплодирую прогрессу в области аппаратных и программных средств. Действительно, техническая сторона работы становится все проще и удобнее. Но как человек я немного насторожен. Сейчас нам еще удается выскакивать из колеса, которое мы упорно крутим. Но тропка-то на волю все сужается.  И как бы нам не нащупать этот самый предел возможностей, благо психо-физиологические возможности гомо сапиенс не способны поспевать за законом Мура.</p>
<p>Что скажете, коллеги? Нагнетаю не по делу? Или есть рациональное зерно? Просто скоро сезон отпусков, а у вас-то рабочее место тоже всегда при себе. Как бороться с работой, если она так заманчиво близка на любом расстоянии от дома?</p>
<img src="http://feeds.feedburner.com/~r/ISNBlogRussia/~4/GOVBXDXohD8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2012/05/15/2007432/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://software.intel.com/ru-ru/blogs/2012/05/15/2007432/</feedburner:origLink></item>
		<item>
		<title>Справочное руководство Intel® TBB – теперь в HTML!</title>
		<link>http://feedproxy.google.com/~r/ISNBlogRussia/~3/EtPeI27b9Sg/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2012/05/15/intel-tbb-html/#comments</comments>
		<pubDate>Tue, 15 May 2012 08:12:43 +0000</pubDate>
		<dc:creator>Vladimir Polin (Intel)</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Параллельное программирование]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[Intel TBB]]></category>
		<category><![CDATA[Intel® Threading Building Blocks]]></category>
		<category><![CDATA[TBB]]></category>
		<category><![CDATA[Threading Building Blocks]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2012/05/15/intel-tbb-html/</guid>
		<description><![CDATA[У нас в Intel® TBB хорошая новость: Справочное руководство Intel® TBB, больше известное обществу как Reference.pdf, теперь доступно в HTML версии на нашем опен-сорс сайте. Добро пожаловать! Так же на страничке документации, как обычно, документы из последнего обновления и выложен новый вариант doxygen-документации. --Владимир]]></description>
			<content:encoded><![CDATA[<p>У нас в Intel® TBB хорошая новость: Справочное руководство Intel® TBB, больше известное обществу как Reference.pdf, теперь доступно в HTML версии на нашем опен-сорс сайте.</p>
<p><a href="http://threadingbuildingblocks.org/docs/help/">Добро пожаловать!</a></p>
<p>Так же на страничке документации, как обычно, документы из последнего обновления и выложен новый вариант <a href="http://threadingbuildingblocks.org/docs/doxygen/">doxygen-документации</a>.</p>
<p>--Владимир</p>
<img src="http://feeds.feedburner.com/~r/ISNBlogRussia/~4/EtPeI27b9Sg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2012/05/15/intel-tbb-html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://software.intel.com/ru-ru/blogs/2012/05/15/intel-tbb-html/</feedburner:origLink></item>
		<item>
		<title>C/C++ like Java</title>
		<link>http://feedproxy.google.com/~r/ISNBlogRussia/~3/zGAEZeH9j2o/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2012/05/15/cc-like-java/#comments</comments>
		<pubDate>Tue, 15 May 2012 06:10:51 +0000</pubDate>
		<dc:creator>Malyshev Egor</dc:creator>
				<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[Acceler8]]></category>
		<category><![CDATA[accelerate 2012]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Си++]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2012/05/15/cc-like-java/</guid>
		<description><![CDATA[Привет всем! Сегодня мы с вами поговорим о любви C/C++ к Java. Связь не очевидна, но она есть. Итак, поехали! В прошлый раз мы с вами говорили об обратной задаче, а стоило ли когда-нибудь выполнять эту? Очевидно, что и такое нам тоже нужно, когда например нашему методу передаётся объект, который предоставляет нам какие-то услуги, которые [...]]]></description>
			<content:encoded><![CDATA[<p>Привет всем!</p>
<p>Сегодня мы с вами поговорим о любви C/C++ к Java. Связь не очевидна, но она есть. Итак, поехали! <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a href="http://software.intel.com/ru-ru/blogs/2012/05/12/java-like-c/">В прошлый раз</a> мы с вами говорили об обратной задаче, а стоило ли когда-нибудь выполнять эту?</p>
<p>Очевидно, что и такое нам тоже нужно, когда например нашему методу передаётся объект, который предоставляет нам какие-то услуги, которые мы в свою очередь должны выполнить. Ну или опять банальный пример, нам попросту нужно вызывать выполнять некоторые задачи из другого проекта в среде своего проекта.</p>
<p>Рассмотрим опять что-нибудь незамысловатое, чтобы не пудрить сильно мозги. <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Допустим, у нас есть Java класс, в котором реализован метод, который приветствует другой объект.  Вот как выглядит класс с методом:</p>
<pre name="code" class="java">public class Hello {
      public static int HelloObject(PeopleObject people)  {
	    System.out.println("Height" + people.height);
	    System.out.println("Name:" + people.name);
	    System.out.println("Town:" + people.town);
	    System.out.println("Age:" + people.age);
	    return OK;
	}
}</pre>
<p>Вот как выглядит сам класс:</p>
<pre name="code" class="java">public class PeopleObject {
	public int height;
	public String name;
	public String town;
	public int age;
	public PeopleObject(int height, String name, String town, int age) {
		this.height = height;
		this.name = name;
		this.town = town;
		this.age = age;
	}
}</pre>
<p>Со стороны Java всё готово, теперь подготовим площадку в C/C++, для вызова нашего метода.</p>
<p>Для того что бы вызвать наш метод  из C/C++, вначале нам понадобится загрузить (создать) JVM (виртуальную Java машину) используя следующее:</p>
<pre name="code" class="cpp">JNIEnv * loadJVM(JavaVM ** jvm) {
    JavaVMOption jvmOptions;
    jvmOptions.optionString = "-Djava.class.path=C:\\JavaClassFiles";
    JavaVMInitArgs jvmArgs;
    jvmArgs.version = JNI_VERSION_1_6;
    jvmArgs.nOptions = 1;
    jvmArgs.options = &#038;jvmOptions;
    jvmArgs.ignoreUnrecognized = JNI_TRUE;
    JNIEnv * env;
    int OK = JNI_CreateJavaVM(jvm, (void**)&#038;env, &#038;jvmArgs);
    if(OK < 0) printf("\nUnable to Launch JVM\n");
    return env;
}</pre>
<p>Итак, по порядку:<br />
<code>jvmOptions.optionString = "-Djava.class.path=C:\\JavaClassFiles";</code><br />
в этой строке мы указываем папку исходников, где располагаются файлы классов. Далее <code>jvmArgs</code> описывает аргументы для вызова Java машины. </p>
<pre name="code" class="cpp">jvmArgs.version = JNI_VERSION_1_6;
jvmArgs.nOptions = 1;
jvmArgs.options = &amp;jvmOptions;
jvmArgs.ignoreUnrecognized = JNI_TRUE;</pre>
<p>в первой строчке мы задаём версию Java, во второй мы задаём кол-во опций, так как они хранятся в массиве, в данном случае мы задаём опцию для Java машины, и в четвёртой строке мы указываем игнорировать все нераспознанные опции, строка которых начинается с "-X" or "_" (Не обязательно).</p>
<p>Теперь вызовем создание Java машины:</p>
<pre name="code" class="cpp">JNIEnv *env;
JavaVM * jvm;
env = loadJVM(&#038;jvm);
if (env == NULL) return BAD;</pre>
<p>А теперь всё готово для начала работы с Java методами, объектами. Для начала найдём два наших класса:</p>
<pre name="code" class="cpp">jclass clsH = env->FindClass("Hello");
jclass clsP = env->FindClass("PeopleObject");</pre>
<p>Метод “FindClass” ищет класс по имени.</p>
<p>Теперь у класса “Hello”, получим метод “HelloObject”.</p>
<pre name="code" class="cpp">jmethodID midHelloObject = NULL;
if (clsH != NULL)  {
	midHelloObject = env->GetStaticMethodID(clsH,"HelloObject","(LPeopleObject;)I");
} else {
    	printf("\nUnable to find the requested class\n");
}</pre>
<p>Тут тоже всё довольно понятно, по сути, мы просто работаем со всеми методами, только через сторонний интерфейс.</p>
<p>Метод <code>GetStaticMethodID</code> ищет метод в классе <code>clsH</code> с именем <code>HelloObject</code> и нужной сигнатурой. О том как генерировать сигнатуру не ручками, скажем позже.</p>
<p>Теперь получим конструктор класса “PeopleObject”, для того, чтобы в него передать нужные параметры для создания объекта.</p>
<pre name="code" class="cpp">jmethodID midPeopleObjectConst = NULL;
if(clsP != NULL)  	{
	midPeopleObjectConst = env->GetMethodID(clsP, "&lt;init&gt;", "(ILjava/lang/String;Ljava/lang/String;I)V");
} else  {
	printf("\nUnable to find the requested class\n");
}</pre>
<p>Словом <code>"&lt;init&gt;"</code> мы показываем, что это будет именно конструктор.<br />
Ну а теперь сделаем то, что задумали:</p>
<pre name="code" class="cpp">jobject jobjPeople = NULL;
if (midHelloObject!=NULL)  {
	if(clsP != NULL &#038;& midHelloObjectConst != NULL)  {
		char  cName[255] = “Yuki”;
		jstring name = env->NewStringUTF(cName);
		char  cTown[255] = “Tokyo”;
		jstring town = env->NewStringUTF(cTown);
		int cHeight = 169;
		jint height = (jint) cHeight;
		int cAge = 17;
		jint age = (jint) cAge;
		jobjPeople = env->NewObject(clsP, midPeopleObjectConst, height, name, town,  age);
	}
	if(jobjPeople != NULL &#038;& midHelloObject!= NULL)
		env->CallStaticIntMethod(clsH,midHelloObject,jobjPeople);
}</pre>
<p>Что тут происходит? Да всё то же самое, подготавливаются параметры для создания объекта <code>PeopleObject</code>. Далее создаётся объект класса <code>PeopleObject</code> через его конструктор. А дальше вызывается метод из класса <code>Hello</code>, с передачей в функцию <code>HelloObject</code>, объекта класса <code>PeopleObject</code>.</p>
<p>Ну и в конце не забываем уничтожить Java машину: <code>jvm-&gt;DestroyJavaVM();</code></p>
<p>Вот и всё <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Ах, да, как же генерировать правильно сигнатуру? Это можно делать и руками, но можно легко ошибиться, да и очень много работы. Генерировать сигнатуры можно при помощи утилиты “javap”, входящей в состав JDK. Например, если запустить её для класса “Hello” (<code>javap -s -p Hello</code>), то мы получим:</p>
<pre name="code" class="cpp">//Compiled from "Hello.java"
public class Hello extends java.lang.Object{
public Hello ();
  	Signature: ()V
public static void main(java.lang.String[]);
  	Signature: ([Ljava/lang/String;)V
public static int HelloObject(PeopleObject);
  	Signature: (LPeopleObject;)I
}</pre>
<p>Cкажу напоследок, что если у вас 64-битная архитектура, то у вас возможно возникнут проблемы с компиляцией и запуском приложения. Дело в том что JDK 64-bit поставляет не совсем пригодные для таких операций библиотеки, поэтому лучше скачать JDK 32-bit и подключать либы оттуда.</p>
<p>Теперь мы показали взаимную любовь Java &amp; C/C++, и можно за них порадоваться <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Подробнее обо всё можно почитать по-прежнему на сайте Oracle.</p>
<img src="http://feeds.feedburner.com/~r/ISNBlogRussia/~4/zGAEZeH9j2o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2012/05/15/cc-like-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://software.intel.com/ru-ru/blogs/2012/05/15/cc-like-java/</feedburner:origLink></item>
		<item>
		<title>Введение в технологию MapReduce</title>
		<link>http://feedproxy.google.com/~r/ISNBlogRussia/~3/PURx48t-faE/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2012/05/14/mapreduce/#comments</comments>
		<pubDate>Mon, 14 May 2012 12:50:08 +0000</pubDate>
		<dc:creator>loken17</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[Acceler8]]></category>
		<category><![CDATA[accelerate 2012]]></category>
		<category><![CDATA[MapReduce]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2012/05/14/mapreduce/</guid>
		<description><![CDATA[Введение Поскольку такие технологии параллельного программирования, как OpenMp, TBB, pthreads, Cilk+ уже широко известны читателям, я решил описать технологию распределенных вычислений MapReduce. Технология, на мой взгляд, пока еще получает недостаточно внимания, хотя уже набирает популярность: Employees From Yahoo, Google, And Facebook Are Flocking To These Start-Ups Краткое описание Возникла технология MapReduce из необходимости обрабатывать данные, [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Введение</strong><br />
Поскольку такие технологии параллельного программирования, как OpenMp, TBB, pthreads, Cilk+ уже широко известны читателям, я решил описать технологию распределенных вычислений MapReduce. Технология, на мой взгляд, пока еще получает недостаточно внимания, хотя уже набирает популярность: <a href="http://articles.businessinsider.com/2011-12-21/tech/30541601_1_mike-volpi-yahoo-vmware">Employees From Yahoo, Google, And Facebook Are Flocking To These Start-Ups</a></p>
<p><strong>Краткое описание</strong><br />
Возникла технология MapReduce из необходимости обрабатывать данные, которые в оперативную память ну никак не влезут. Да и на жесткий диск, в общем-то, тоже: технология нацелена на обработку петабайтов (10^15) данных. Обрабатываются данные, соответственно, на кластере. Данными являются таблицы, содержащие список записей вида <code>(KEY, VALUE)</code>. Пользователю достаточно задать функции обработки Map и Reduce (подробнее о них - чуть позже), и платформа сама позаботится о сортировке данных, запуске функций обработки, повторном исполнении упавших транзакций и много чем еще.</p>
<p>Две функции, которые предлагается реализовать пользователю, таковы:</p>
<p><strong>Map</strong> - функция, принимающая на вход одну запись вида (KEY, VALUE), и возвращающая по ней любое количество новых записей <code>(KEY1, VALUE1), (KEY2, VALUE2), ...</code></p>
<p><strong>Reduce </strong>- функция, принимающая на вход все записи с данным ключом. Итерируясь по ним, она так же может возвращать любое количество новых записей.<br />
Более формально, функция работает по принципу <code>{(KEY, VALUE1), (KEY, VALUE2), ...} → (KEY1, VAL1), (KEY2, VAL2), ...</code></p>
<p>В чем смысл таких функций? Суть в том, что обрабатывать петабайты данных можно, грубо говоря, только линейными алгоритмами. Если алгоритм работает O(n^2) - можно считать, что он просто не работает <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Для поточной линейной обработки данные можно менять и преобразовывать (Map), и можно сливать, комбинируя полученные результаты (Reduce). Эти операции легко параллелятся на кластерах из любого числа машин, поэтому и допускают столь впечатляющие объемы масштабирования.</p>
<p><strong>Пример использования</strong><br />
Но теперь перейдем от теории к практике. Рассмотрим упрощенный вариант задачи, стоящей перед поисковиками. У нас есть база данных страниц в Интернете, и мы хотим, сколько раз ссылаются на каждую страницу. Как это сделать?</p>
<p>Пусть сохраненные страницы хранятся в виде <code>(KEY = URL, VALUE = PAGE_TEXT)</code>.</p>
<p><strong>Шаг 1)</strong> Запустим на этой базе данных операцию Map. Получив на вход текст страницы, она выделит все исходящие ссылки:</p>
<pre name="code" class="cpp">
void Map(String key, String value) {
    for url in GetUrls(value) {
        OutputRecord(url, 1)
    }
}</pre>
<p>После запуска этой операции, мы получим список записей вида <code>(KEY = URL, VALUE = 1)</code>. В чем смысл этой единички? Идем дальше:<br />
<strong>Шаг 2)</strong> Операция Reduce. Здесь мы принимаем все записи с одинаковым ключом (то есть одинаковым URL). Псевдокод:</p>
<pre name="code" class="cpp">
void Map(String key, Iterator it) {
    int count = 0;
    while (it.HasMoreRecords()) {
        count += it.GetValue();
    }
    OutputRecord(key, count);
}</pre>
<p>Проследим работу этого псевдокода на примере.<br />
Пусть есть страница <em>aa.com</em> со ссылками на <em>aa.com, bb.com, cc.com</em>, страница <em>bb.com</em> с двумя ссылками на <em>aa.com</em> и страница <em>cc.com</em>, на которой нет ссылок вообще.<br />
После первого этапа программы, получим выходную таблицу:</p>
<pre name="code" class="cpp">(aa.com, 1)
(bb.com, 1)
(cc.com, 1)
(aa.com, 1)
(aa.com, 1)</pre>
<p>Между запусками Map и Reduce таблица будет отсортирована, чтобы можно было объединить записи с одинаковым ключом. Получим:</p>
<pre name="code" class="cpp">(aa.com, 1)
(aa.com, 1)
(aa.com, 1)
(bb.com, 1)
(cc.com, 1)</pre>
<p>Наконец, после выполнения второго шага выходная таблица будет иметь вид:</p>
<pre name="code" class="cpp">(aa.com, 3)
(bb.com, 1)
(cc.com, 1)</pre>
<p>Вуаля, ровно это мы и искали.</p>
<p><strong>Заключение</strong><br />
В следующем посте я хотел бы рассказать про одну из реализаций MapReduce с открытым исходным кодом, Apache Hadoop, а также поговорить про вспомогательные операции, которые предоставляет эта платформа (Combine и Partition). Воспользовавшись этим фреймворком, мы напишем программу, подсчитывающую топ наиболее частых слов в википедии.</p>
<img src="http://feeds.feedburner.com/~r/ISNBlogRussia/~4/PURx48t-faE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2012/05/14/mapreduce/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://software.intel.com/ru-ru/blogs/2012/05/14/mapreduce/</feedburner:origLink></item>
		<item>
		<title>Вебинар "Введение в библиотеку Intel(R) Math Kernel Library" 15 мая 2012 года в 10:00 утра по московскому времени</title>
		<link>http://feedproxy.google.com/~r/ISNBlogRussia/~3/AbwR3VuBk-M/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2012/05/14/intelr-math-kernel-library-15-2012-1000/#comments</comments>
		<pubDate>Mon, 14 May 2012 11:59:25 +0000</pubDate>
		<dc:creator>SERGEY G (Intel)</dc:creator>
				<category><![CDATA[ISN календарь]]></category>
		<category><![CDATA[15.05.2012]]></category>
		<category><![CDATA[Intel Math Kernal Library (Intel MKL)]]></category>
		<category><![CDATA[вебинар]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2012/05/14/intelr-math-kernel-library-15-2012-1000/</guid>
		<description><![CDATA[Вебинар "Введение в библиотеку Intel(R) Math Kernel Library" состоится 15 мая 2012 года в 10:00 по московскому времени и познакомит вас с инструментом для достижения высокой производительности базовых математических вычислений на процессорах х86. Узнать детали и пройти регистрацию на вебинар можно здесь. Мы вас очень ждём на нашем вебинаре!]]></description>
			<content:encoded><![CDATA[<p>Вебинар "Введение в библиотеку Intel(R) Math Kernel Library" состоится 15 мая 2012 года в 10:00 по московскому времени и познакомит вас с инструментом для достижения высокой производительности базовых математических вычислений на процессорах х86. Узнать детали и пройти регистрацию на вебинар можно <a href="http://seminars.softline.ru/event/5860/detail">здесь</a>.<br />
Мы вас очень ждём на нашем вебинаре!</p>
<img src="http://feeds.feedburner.com/~r/ISNBlogRussia/~4/AbwR3VuBk-M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2012/05/14/intelr-math-kernel-library-15-2012-1000/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://software.intel.com/ru-ru/blogs/2012/05/14/intelr-math-kernel-library-15-2012-1000/</feedburner:origLink></item>
		<item>
		<title>Java like С/C++</title>
		<link>http://feedproxy.google.com/~r/ISNBlogRussia/~3/yjuMak2CtzI/</link>
		<comments>http://software.intel.com/ru-ru/blogs/2012/05/12/java-like-c/#comments</comments>
		<pubDate>Sat, 12 May 2012 09:14:17 +0000</pubDate>
		<dc:creator>Malyshev Egor</dc:creator>
				<category><![CDATA[Intel Software Network]]></category>
		<category><![CDATA[Разработка софта]]></category>
		<category><![CDATA[Acceler8]]></category>
		<category><![CDATA[Accelerate]]></category>
		<category><![CDATA[accelerate 2012]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JNI]]></category>
		<category><![CDATA[Си++]]></category>

		<guid isPermaLink="false">http://software.intel.com/ru-ru/blogs/2012/05/12/java-like-c/</guid>
		<description><![CDATA[Привет всем! Сегодня мы с вами поговорим о любви Java к C++. Связь не очевидна, но она есть. Итак, поехали! Порой в нашей жизни требуется использовать код, написанный на другом языке. Опишем несколько случаев такой необходимости: Пускай у вас есть проверенный на 100% код на другом языке. Для того что бы его перевести на язык [...]]]></description>
			<content:encoded><![CDATA[<p>Привет всем!</p>
<p>Сегодня мы с вами поговорим о любви Java к C++. Связь не очевидна, но она есть. Итак, поехали!</p>
<p>Порой в нашей жизни требуется использовать код, написанный на другом языке. Опишем несколько случаев такой необходимости:</p>
<ul>
<li>Пускай у вас есть проверенный на 100% код на другом языке. Для того что бы его перевести на язык Java, потребуется немало времени, а полученный код нужно опять проверять и отлаживать. Особенно если это огромная библиотека или проект.</li>
<li>Или нам нужны низкоуровневые операции для доступа к аппаратным средствам, в таком случае Java не очень подходит для таких операций. </li>
<li>Или если нам нужно множественное применение сложных операций с машиной, требующих очень оптимизированного кода, чего на Java опять не добьёшься (хотя этому можно поставить в противовес just-in-time компиляцию). </li>
</ul>
<p>Если мы всё же столкнулись с одной из вышеперечисленных проблем, то, скорее всего нам-таки придётся научиться вызывать платформенно-ориентированный код прямиком из Java. Для этого в Java предусмотрены специальные способы работы с системными библиотеками, а JDK содержит инструменты, которые позволят нам справиться с этими проблемами.</p>
<p>Конечно, всё это не избавляет нас от полноценного решения, так как для каждой операционной системы потребуются библиотеки, ориентированные именно на эту среду, и хоть и Java очень хорошо контролируемый язык, то C++ в свою очередь неконтролируем, поэтому возможно, что методы из C++ выведут из строя виртуальную Java-машину, либо вызовет сбой системы или ещё что-нибудь.</p>
<p>Но выбор за вами, стоит ли это делать в ситуации, с которой вы столкнулись или нет <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Я не буду описывать кучу методов, кучу ситуаций, и тому подобное, это лучше всего расскажет специализированная книжка, а тут будет приведены примеры почти стандартных задач, вида Hello “damn” world! <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Итак, наша задача: на языке C/C++ есть функция, которая выполняет какие-то сумасшедше-полезные действия. И мы хотим её вызвать из Java (да-да, нам лень переписать её на Java <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ). Пускай это функция вывода printf (можно использовать и другие, но будем ориентироваться на C), которая приветствует передаваемую строку и какое-то число.</p>
<p>Для того, чтобы в Java показать, что функция будет платформенно-ориентированной, есть ключевое слово “<strong>native</strong>”, которое предупреждает компилятор о внешнем определении данного метода.  Саму функцию нужно описывать в классе.</p>
<pre name="code" class="java">public static native void welcome(String str, int value);</pre>
<p>В данном случае функция объявлена как статическая, но это не обязательное условие. Теперь поместим её в класс:</p>
<pre name="code" class="java">class Hello {
      public static native void welcome(String str, int value);
}</pre>
<p>Такой класс откомпилировать вы сможете, но вылетит исключение, говорящее, что программа не может найти метод. Для того? чтобы метод был найден, его тело нужно создать на C/C++, причём не просто метод, а метод говорящий что его будут вызывать из кода на Java. Но об этом попозже, просто знайте, что мы создадим разделяемую библиотеку для экспорта на C/C++, а далее загрузим её в Java. И только тогда программа найдёт этот метод и сможет успешно выполняться.</p>
<p>Библиотеку удобнее всего подключить в статическом блоке, чтобы при вызове функции, она уже была подгружена. И вот что получается:</p>
<pre name="code" class="java">class Hello {
   public static native void welcome(String str, int value);
   static  {
      System.loadLibrary("JAVALOVECHELLO");
   }
}</pre>
<p>Метод <code>loadLibrary("JAVALOVECHELLO")</code>, загружает библиотеку по имени <code>JAVALOVECHELLO</code>. </p>
<p>Теперь настало время для создания C/C++ функции, имя которой должно строго (значит точно) соответствовать соглашениям об именовании:</p>
<ul>
<li> Имя метода в C/C++ должно полностью соответствовать ПОЛНОМУ имени в Java программе. Например, если мы поместим программу в пакет com.intel, тогда полное имя Java-метода будет com.intel.Hello.welcome. Теперь нужно заменить все точки на нижние подчёркивания (_) и добавить префикс “Java_”, получим строку <code>Java_com_intel_Hello_welcome</code>. Если код находится в пакете “default”, то имя C-функции должно выглядеть так: <code>Java_Hello_welcome</code>. </li>
<li>Стоит быть внимательными с различными Unicode-символами: их нужно заменять на их 16-ричное представление, но об этом не будем тут. На самом деле и это ещё не все соглашения, но сейчас расскажем, как не делать этого ручками.</li>
</ul>
<p>Для правильно описанных методов не стоит их создавать руками, для этого воспользуемся специальной утилитой “<strong>javah</strong>”, которая есть в JDK. Для начала откомпилируем наш Java-файл, используя “<strong>javac</strong>”.</p>
<p><code>javac Hello.java</code></p>
<p>Теперь воспользуемся “javah”.</p>
<p><code>javah Hello</code></p>
<p>В результате выполнения этих операций мы получим файл “Hello.h”</p>
<pre name="code" class="cpp">
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class Hello */
#ifndef _Included_Hello
#define _Included_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Hello
 * Method:    welcome
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_Hello_welcome
  (JNIEnv *, jclass, jstring, jint);
#ifdef __cplusplus
}
#endif
#endif</pre>
<p>Как видно, так как мы пишем на C++, то добавлена строчка <code>extern "C"</code>, которая об этом сообщает. Имена <code>JNIEXPORT</code> и <code>JNICALL</code> описаны в <code>jni.h</code>, они задают спецификаторы функций, экспортируемых из динамических библиотек .</p>
<p>В данном файле всё довольно понятно, всё как мы и предполагали (на самом деле не всё, но об этом позже).</p>
<p>Осталось для данного файла заголовка написать соответствующий файл c исходным кодом, где мы и опишем тело метода.</p>
<p>Вот как он будет выглядеть:</p>
<pre name="code" class="cpp">
#include "Hello.h"
#include
JNIEXPORT void JNICALL Java_Hello_welcome(JNIEnv* env, jclass cl, jstring str, jint value)
{
   const char * ccstr;
   ccstr = (*env).GetStringUTFChars(str, NULL);
   printf("Hello damn World, %s, %d!\n", ccstr, (int)value);
}
</pre>
<p>Во всех вызовах JNI-функций есть указатель <code>env</code>, который является первым параметром любого платформенно-ориентированного метода. Параметр <code>env</code> указывает на таблицу функций, содержащую указатели функций. </p>
<p>Как наверно можно догадаться <code>jstring</code>, <code>jint</code> это по сути те же <code>string</code>, <code>int</code>, но только в понимании JNI (их соответствия).</p>
<p>Функция <code>GetStringUTFChars()</code> возвращает указатель <code>const jbyte *</code> на символы строки, представленные в формате UTF-8. Также не помешает после использования строк освобождать память. Если же этого не делать, то это может повлиять на работу метода (память не безгранична). Для этих целей нужно использовать метод <code>ReleaseStringUTFChars()</code>.</p>
<p>Очень подробное описание всех функций (API JNI) можно найти сайте Oracle, по этой ссылке - <a href="http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html">http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html</a>.</p>
<p>Как компилировать динамическую библиотеку каждый выбирает сам, это можно сделать вручную, или можно предоставить всё MVS.</p>
<p>Нужные вам библиотеки, необходимые для успешной компиляции C/C++, лежат в <strong>JDK/include</strong>.</p>
<p>Ну и осталось написать вызов функции из Java-программы:</p>
<pre name="code" class="java">
class HelloTest {
   public static void main(String[] args)    {
      Hello.welcome("I'm a string", 100500);
   }
}
</pre>
<p>На этом закончим, хоть и было рассмотрено материала 7% от общего, но тут главное смысл, а дальше уже как по маслу, берёшь и намазываешь <img src='http://software.intel.com/ru-ru/blogs/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/ISNBlogRussia/~4/yjuMak2CtzI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/ru-ru/blogs/2012/05/12/java-like-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://software.intel.com/ru-ru/blogs/2012/05/12/java-like-c/</feedburner:origLink></item>
	</channel>
</rss>

