| <html> |
| <head> |
| <title>Начало работы с JNI с IDE NetBeans и подключаемым модулем C/C++ Plugin в Linux</title> |
| <meta name="DESCRIPTION" content="A tutorial describing how to compile |
| and run JNI powered Java applications using NetBeans IDE"> |
| <meta name="author" content="Susan Morgan"><!--Optional tag--> |
| <link rel="stylesheet" type="text/css" href="../../../netbeans.css"> |
| <meta HTTP-EQUIV="Content-Type" Content="text/html; charset=UTF-8"></head> |
| <body> |
| <a name="top"></a> |
| |
| <h1>Начало работы с JNI с IDE NetBeans и подключаемым модулем C/C++ Plugin в Linux</h1> |
| <!-- START INTRO ---------------------------------------------------------------------------------------* --> |
| <div class="articledate" style="margin-left: 0px;font-style:italic;"> |
| <p><em>Составитель: <i>Сьюзан Морган (Susan Morgan)</i> <br> Июнь 2009 г.</em> [номер версии: V6.7-1]</div> |
| |
| <p>В этой учебной программе рассматривается создание простого приложения, использующего код Java<sup><small>TM</small></sup> Native Interface (JNI), написанный на языке программирования C. |
| <p class="notes">Этот учебный курс создан для Linux.</p> |
| <!-- END INTRO --> |
| |
| <h3>Содержание</h3> |
| <img alt="Содержимое на этой странице применимо к IDE NetBeans 6.7, 6.8 и 6.9" class="stamp" src="../../../images_www/articles/67/netbeans-stamp-67-68-69.png" title="Содержимое этой страницы применимо к IDE NetBeans 6.7, 6.8 и 6.9"> |
| <table class="b-none" cellpadding="0" cellspacing="0" class="vatop"> |
| <tr> |
| <td class="hyphen">- </td> |
| <td><a href="#requirements" title="Требования">Требования</a></td> |
| </tr> |
| <tr> |
| <td class="hyphen">- </td> |
| <td><a href="#modules" title="Настройка среды для учебного курса"> Настройка среды для учебного курса</a></td> |
| </tr> |
| <tr> |
| <td class="hyphen">- </td> |
| <td><a href="#javaproject" title="Настройка проекта приложения Java">Настройка проекта приложения Java</a></td> |
| </tr> |
| <tr> |
| <td class="hyphen">- </td> |
| <td><a href="#c-library" title="Настройка нового проекта динамической библиотеки на языке C/C++"> Настройка нового проекта динамической библиотеки на языке C/C++</a> |
| </td> |
| </tr> |
| <tr> |
| <td class="hyphen">- </td> |
| <td><a href="#running" title="Сборка и запуск приложения">Сборка и запуск приложения</a></td> |
| </tr> |
| <tr> |
| <td class="hyphen">- </td> |
| <td><a href="#next" title="Что дальше?">Следующие действия</a></td> |
| </tr> |
| </table> |
| |
| <h2><a NAME="requirements"></a>Требования</h2> |
| <p><b>Для работы с этим учебным курсом требуется следующее программное обеспечение и ресурсы.</b> </p> |
| |
| <table> |
| <tbody> |
| <tr> |
| <th class="tblheader" scope="col">Программное обеспечение или материал</th> |
| <th class="tblheader" scope="col">Требуемая версия</th> |
| </tr> |
| <tr> |
| <td class="tbltd1">IDE NetBeans</td> |
| <td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">версия 6.7 с подключаемым модулем NetBeans C/C++</a></td> |
| </tr> |
| <tr> |
| <td class="tbltd1">Комплект для разработчика на языке Java (JDK)</td> |
| <td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">версия 6</a></td> |
| </tr> |
| <tr> |
| <td class="tbltd1"> |
| Компиляторы C и C++, <tt>make</tt>, <tt>gdb</tt> <br> |
| </td> |
| <td class="tbltd1"><br> |
| <p> |
| <a href="./supported-tool-collections.html">Набор инструментов C/C++, простестированный с помощью IDE NetBeans</a> |
| |
| </table> |
| <p>Дополнительные сведения о загрузке и установки необходимого программного обеспечения см. в разделах <a href="../../../community/releases/67/install.html">Инструкции по установки IDE NetBeans 6.7</a> и <a HREF="../../../community/releases/67/cpp-setup-instructions.html"> Настройка IDE NetBeans дляC/C++/Fortran</a>. |
| </p> |
| |
| <h2><a name="modules"></a>Настройка среды для учебного курса</h2> |
| <p>Для этого учебного курса потребуются модули Java и C/C++. Если комплект C/C++ IDE NetBeans уже загружен, пользователи могут загрузить дополнительные модули Java по отдельности.</p> |
| <p>Чтобы определить наличие модулей Java и C/C++, выберите пункт меню "Файл > Новый проект". В категории проектов должны входить Java и C/C++. |
| <p><b>Чтобы загрузить отсутствующие модули Java и C/C++, выполните следующие действия.</b></p> |
| <ol><li>В IDE NetBeans выберите 'Сервис' > 'Подключаемые модули'.</li> |
| <li>Во вкладке "Доступные подключаемые модули" установите флажок для Java или C/C++ в зависимости от того, какой модуль отсутствует в среде IDE. Если оба модуля уже установлены, они отобразятся во вкладке "Установлено". |
| </li> |
| <li>Нажмите кнопку "Установить".</li> |
| <li>Щелкните 'Далее' в диалоговом окне установщика IDE NetBeans, установите флажок принятия условий лицензии установщика и щелкните 'Установить'.</li> |
| <li>По завершении установки нажмите кнопку "Готово".</li></ol> |
| |
| <h2><a name="javaproject"></a>Настройка проекта приложения Java</h2> |
| <p> |
| Для данной программы требуются проект Java и проект C. В этом разделе описаны создание и настройка проекта Java для разрабатываемого приложения JNI. Для этого потребуется создать проект приложения Java, инициализировать его главный класс и добавить метод в машинном коде к этому классу. |
| </p> |
| <ol> |
| <li>Выберите команду "Файл" > "Новый проект". Выберите категорию "Java" и тип проекта "Приложение Java". Нажмите кнопку "Далее".</li> |
| <img alt="моментальный снимок мастера создания проектов" class="margin-around" src="../../../images_www/articles/72/cnd/beginning-jni-linux/jni-new-project-java.png"> |
| <li>В поле "Имя проекта" введите <tt>JNIDemoJava</tt>.</li> |
| <li>В качестве местоположения проекта можно указать любой каталог на компьютере. В этом примере используется папка по умолчанию "NetBeansProjects" в каталоге пользователя. |
| </li> |
| <li>Установите флажок "Создать главный класс" и оставьте значение по умолчанию в соответствующем текстовом поле.</li> |
| <li> |
| <p>оставьте флажок "Установить как главный проект" установленным. Затем нажмите кнопку "Готово". |
| </p> |
| <p> |
| В среде IDE будет создана папка проекта <tt>NetBeansProjects/JNIDemoJava</tt>. |
| </p> |
| <br> <img alt="Снимок страницы 'Имя и местоположение' мастера создания приложений Java" class="margin-around" src="../../../images_www/articles/72/cnd/beginning-jni-linux/jni-new-java-app.png"> |
| </li> |
| </ol> |
| <h3>Изменение исходного кода главного класса</h3> |
| <ol> |
| <li>Чтобы открыть источник класса Main в редакторе, щелкните правой кнопкой мыши узел класса <tt>Main.java</tt> и выберите 'Открыть'.</li> |
| <li>Замените тело метода <tt>main</tt> на следующий текст: |
| <pre class="examplecode">new Main().nativePrint();</pre> |
| </li> |
| <li>В поле слева появится индикатор в виде лампочки, сообщающий об ошибке. Щелкните индикатор. Отобразится ярлык для создания метода <tt>nativePrint</tt>. </li> |
| <li>Щелкните этот ярлык, после чего будет вставлен следующий код: |
| <pre class="examplecode">private void nativePrint() { |
| throw new UnsupportedOperationException("Not yet implemented"); |
| }</pre> |
| |
| </li> |
| <li>Измените тело метода <tt>nativePrint()</tt>: удалите его содержимое и вставьте ключевое слово <tt>native</tt> в сигнатуру метода, чтобы он выглядел следующим образом: |
| <pre class="examplecode">private native void nativePrint();</pre> |
| <p> |
| Ключевое слово <tt>native</tt> означает, что реализация этого метода размещена во внешней библиотеке в машинном коде. Однако при запуске местоположение библиотеки не ясно. |
| </p> |
| <p>Новый метод main будет выглядеть следующим образом:</p> |
| <pre class="examplecode">public static void main(String[] args) { |
| new Main().nativePrint(); |
| } |
| |
| private native void nativePrint(); |
| }</pre> |
| |
| </li> |
| |
| <li>Правой кнопкой мыши щелкните имя проекта и выберите пункт "Очистить и собрать". После этого проект должен успешно собраться. |
| </li> |
| </ol> |
| <h3><a name="header"></a>Создание файла заголовка библиотеки в машинном коде</h3> |
| В этом разделе будет использоваться <tt>javah</tt> – средство Java, используемое для создания заголовка на языке C из класса Java. |
| <ol> |
| <li>В окне терминала перейдите к каталогу <tt>NetBeansProjects</tt>. |
| </li> |
| <li>Введите следующее значение: |
| <pre class="examplecode"> |
| javah -o JNIDemoJava.h -classpath JNIDemoJava/build/classes jnidemojava.Main |
| </pre> |
| <p> |
| В каталоге NetBeansProjects будет создан файл заголовка на языке C <tt>JNIDemoJava.h</tt>. Этот файл требуется для того, чтобы обеспечить предоставление правильного объявления функции для реализации метода <tt>nativePrint()</tt> в машинном коде. Он понадобится позже при создании части приложения на языке C.</p> |
| </li> |
| <li>Переключение обратно в окно IDE NetBeans. |
| </li> |
| </ol> |
| <p><b>Заключение</b> |
| <p>В этом упражнении вы создали новый проект приложения Java, указали его местоположение и определили пакет и имя главного класса этого проекта. Вы также добавили новый метод к главному классу и пометили его как метод с реализацией в машинном коде. В завершение вы создали файл заголовка на языке C, который понадобится позже при компиляции библиотеки в машинный код.</p> |
| |
| <h2><a name="c-library"></a>Настройка нового проекта динамической библиотеки на языке C/C++</h2> |
| <p>В этом разделе рассматривается процесс создания части приложения в машинном коде. Вы создадите проект динамической библиотеки на языке C++ и настроите его для сборки кода JNI. |
| </p> |
| <p>После настройки проекта вы создадите реализацию для метода в машинном коде, который был объявлен ранее в части приложения на языке Java. |
| |
| <ol> |
| <li> |
| Выберите команду "Файл" > "Новый проект". В окне "Категории" выберите C/C++. В окне "Проекты" выберите "Динамическая библиотека C/C++". Нажмите кнопку "Далее". <br> <img alt="Снимок страницы 'Выбор проекта' мастера создания проектов" class="margin-around" src="../../../images_www/articles/72/cnd/beginning-jni-linux/jni-new-project-c.png"> |
| </li> |
| <li>В поле "Имя проекта" введите <tt>JNIDemoCdl</tt>. |
| </li> |
| <li>В поле "Местоположение проекта" укажите то же местоположение, которое было использовано для проекта приложения Java – <tt>NetBeansProjects</tt>. Это местоположение должно отобразиться по умолчанию. |
| </li> |
| <li>Для всех других полей также оставьте значения по умолчанию. |
| </li> |
| <li> |
| <p>оставьте флажок "Установить как главный проект" установленным. Затем нажмите кнопку "Готово". |
| <p>В среде IDE будет создана папка проекта <tt>NetBeansProjects/JNIDemoCdl</tt>. |
| </p> |
| </li> |
| </ol> |
| <h3>Настройка свойств проекта</h3> |
| <ol> |
| <li>Правой кнопкой мыши щелкните узел проекта "JNIDemoCdl" и выберите "Свойства". |
| </li> |
| <li> |
| В диалоговом окне свойств выберите узел "Компилятор C" в свойствах "Сборка" узла.</li> |
| <li>Нажмите кнопку "Включить каталоги...", затем нажмите кнопку "Добавить" в диалоговом окне "Включить каталоги". |
| <li>Перейдите к каталогу JDK и выберите подкаталог <tt>include</tt>. </li> |
| <li>Выберите пункт "Сохранить как абсолютный", затем нажмите кнопку "Выбрать", чтобы добавить этот каталог во включенные каталоги проекта.</li> |
| <li>Аналогичным образом добавьте каталог JDK <tt>include/linux</tt>, затем нажмите кнопку "ОК".</li> |
| |
| <img alt="Снимок диалогового окна "Свойства проекта" и диалогового окна "Каталоги, включающие отладку"." class="margin-around" src="../../../images_www/articles/72/cnd/beginning-jni-linux/jni-include-directories.png"> |
| |
| <p>Эти параметры требуются для включения ссылок на библиотеку Java <tt>jni.h</tt> из кода C. |
| </p> |
| |
| <li> |
| Найдите область "Командная строка" в параметрах компилятора C. Щелкните текстовое поле в свойстве 'Дополнительные параметры' и введите <tt>-shared -m32</tt>. <img alt="Снимок редактируемого поля Debug-Additional Optionstext" class="margin-around" src="../../../images_www/articles/72/cnd/beginning-jni-linux/jni-project-properties-cmd-options.png"> |
| |
| <p> |
| Параметр <tt>-shared</tt> указывает создание динамической библиотеки.<br> Параметр <tt>-m32</tt> указывает создание двоичного файла для 32-разрядных платформ. По умолчанию в 64-разрядных системах компилируются двоичные файлы для 64-разрядных платформ, что приводит к возникновению множества проблем в 32-разрядных JDK. |
| </p> |
| </li> |
| <li> |
| Перейдите в категорию "Компоновщик" на левой панели.<br> <img alt="Снимок диалогового окна "Свойства проекта" со свойства Linker" class="margin-around" src="../../../images_www/articles/72/cnd/beginning-jni-linux/jni-project-properties-linker.png"> |
| |
| |
| </li> |
| <li>Поставьте курсор в текстовое поле "Вывод" и замените строку |
| <pre class="examplecode">$[CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libJNIDemoCdl.so</pre> |
| |
| на строку |
| <pre class="examplecode">dist/libJNIDemoCdl.so</pre> |
| чтобы упростить путь к созданному файлу совместно используемого объекта. Это поможет упростить процесс создания ссылки из Java.</li> |
| <li>Нажмите кнопку "ОК". Определенные параметры сохранены. |
| </li> |
| </ol> |
| |
| <h3>Добавление файла заголовка</h3> |
| <ol> |
| <li>Перейдите в окно терминала и переместите ранее созданный файл заголовка <tt>JNIDemoJava.h</tt> из каталога <tt>NetBeansProjects</tt> в каталог проекта библиотеки C/C++ – <tt>NetBeansProjects/JNIDemoCdl</tt>. |
| </li> |
| <li> |
| <p>В окне 'Проекты' щелкните правой кнопкой мыши узел 'Исходные файлы' проекта <tt>JNIDemoCdl</tt> и выберите 'Добавить существующий элемент'. Перейдите к <tt>NetBeansProjects/JNIDemoCdl</tt> и выберите файл <tt>JNIDemoJava.h</tt>, затем нажмите кнопку "ОК". |
| </p> |
| <p>Файл <tt>JNIDemoJava.h</tt> отобразится в узле "Исходные файлы". |
| </p> |
| |
| <img alt="снимок окна 'Проекты'" class="margin-around" src="../../../images_www/articles/72/cnd/beginning-jni-linux/jni-source-files-include-file.png"> |
| </li> |
| </ol> |
| <h3>Реализация метода</h3> |
| |
| <ol> |
| <li>Правой кнопкой мыши щелкните узел "Исходные файлы" проекта<tt>JNIDemoCdl</tt>, затем выберите пункт "Создать > Исходный файл C". Введите <tt>JNIDemo</tt> в поле "Имя файла", затем нажмите кнопку "Готово". В редакторе откроется файл <tt>JNIDemo.c</tt>. |
| </li> |
| <li>Измените файл <tt>JNIDemo.c</tt>, введя следующий код: |
| <pre class="examplecode"> |
| #include <jni.h> |
| #include <stdio.h> |
| #include "JNIDemoJava.h" |
| |
| JNIEXPORT void JNICALL Java_jnidemojava_Main_nativePrint |
| (JNIEnv *env, jobject obj) |
| { |
| |
| printf("\nHello World from C\n"); |
| |
| } |
| </pre> |
| </li> |
| <li>Сохраните файл <tt>JNIDemo.c</tt>.</li> |
| <li> |
| Правой кнопкой мыши щелкните узел <tt>JNIDemoCdl</tt> и выберите пункт "Сборка проекта". В окне вывода отобразится: <tt>Build successful. Выходное значение 0.</tt> |
| </li> |
| </ol> |
| <p><b>Заключение</b></p> |
| |
| <p>В этом упражнении вы создали новую динамическую библиотеку C/C++, указали ее местоположение и настроили ее для сборки реализации JNI метода Java. Вы добавили созданный файл заголовка для метода в машинном коде, объявленного в приложении Java, и выполнили его реализацию. |
| </p> |
| </div> |
| <h2><a name="running"></a>Сборка и запуск приложения</h2> |
| <p> |
| В этом упражнении вы выполните ряд окончательных изменений в части приложения на языке Java. Эти изменения нужны, чтобы часть приложения на языке Java правильно выполнила загрузку библиотеки в машинном коде, скомпилированной в предыдущем упражнении. После этого вы выполните компиляцию созданного приложения и запустите его. |
| </p> |
| <div class="indent"> |
| <h3>Настройка проекта Java</h3> |
| <ol> |
| <li>Откройте файл <tt>Main.java</tt> в редакторе. |
| <li>Добавьте код инициализации, используя путь к выходному файлу, который был упрощен в предыдущем упражнении: |
| <pre class="examplecode"> |
| static { |
| System.load("<i>full-path-to-NetBeansProjects-dir</i>/JNIDemoCdl/dist/libJNIDemoCdl.so"); |
| } |
| </pre> |
| Путь <i>full-path-to-NetBeansProjects-dir</i> должен выглядеть приблизительно следующим образом: <tt>/home/username/NetBeansProjects</tt> |
| |
| </li> |
| <li>Сохраните файл <tt>Main.java</tt>.</li> |
| |
| </ol> |
| <h3>Запуск приложения</h3> |
| <ol> |
| <li>Чтобы настроить проект Java <tt>JNIDemoJava</tt> как главнй проект, щелкните правой кнопкой мыши узел проекта и выберите 'Установить как главный проект'.</li> |
| <li>Чтобы запустить приложение, нажмите клавишу F6 или кнопку "Выполнить" на панели инструментов. После этого программа будет выполнена, и в окне вывода отобразится следующее сообщение: <br> <img alt="Снимок окна вывода" class="margin-around" src="../../../images_www/articles/72/cnd/beginning-jni-linux/jni-build-success.png"> |
| </li> |
| </ol> |
| <h3>Заключение</h3> |
| <p>В этом упражнении вы выполнили окончательную настройку и запустили приложение, чтобы проверить, что реализация метода в машинном коде берется из библиотеки C, скомпилированной в машинный код. |
| </p> |
| </div> |
| <h2><a name="next"></a>Что дальше?</h2> |
| <p>Чтобы проверить проект на рабочем примере, <a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FCPlusPlus%252FJNIDemo.zip" target="_blank"> загрузите файл ZIP, содержащий исходный код,</a> с веб-сайта netbeans.org. |
| </p> |
| |
| |
| <p> |
| Для получения дополнительной информации используйте следующие документы: |
| <ul> |
| <li><a href="quickstart.html">Краткий учебный курс по работе с проектами C/C++</a> |
| |
| <li><a href="http://en.wikipedia.org/wiki/Java_Native_Interface" target="_blank">Интерфейс Java с машинным кодом (Java Native Interface)</a> |
| |
| </ul> |
| <DIV CLASS="feedback-box"> |
| <a HREF="https://netbeans.org/about/contact_form.html?to=7&subject=Feedback:Beginning JNI with NetBeans IDE and C/C++ Plugin on Linux">Мы ждем ваших отзывов</a> |
| </DIV> |
| </body> |
| </html> |