| // |
| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| // |
| |
| = Начало работы с JNI с IDE NetBeans и подключаемым модулем C/C++ Plugin в Linux |
| :jbake-type: tutorial |
| :jbake-tags: tutorials |
| :jbake-status: published |
| :icons: font |
| :syntax: true |
| :source-highlighter: pygments |
| :toc: left |
| :toc-title: |
| :description: Начало работы с JNI с IDE NetBeans и подключаемым модулем C/C++ Plugin в Linux - Apache NetBeans |
| :keywords: Apache NetBeans, Tutorials, Начало работы с JNI с IDE NetBeans и подключаемым модулем C/C++ Plugin в Linux |
| |
| _Март 2014 г._ [Номер версии: V8.0-1] |
| |
| В этой учебной программе рассматривается создание простого приложения, использующего код Java^TM^ Native Interface (JNI), написанный на языке программирования C. |
| |
| Этот учебный курс создан для Linux. |
| |
| |
| == Требования |
| |
| *Для работы с этим учебным курсом требуется следующее программное обеспечение и ресурсы.* |
| |
| |=== |
| |Программное обеспечение или материал |Требуемая версия |
| |
| |IDE NetBeans |link:https://netbeans.org/downloads/index.html[+версия 7.4 или 8.0 с подключаемым модулем NetBeans C/C+++] |
| |
| |Комплект для разработчика на языке Java (JDK) |link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+версия 7 или 8+] |
| |
| |Компиляторы C и C++, ``make`` , ``gdb`` |link:../../../community/releases/80/cpp-setup-instructions.html[+ Настройка среды IDE NetBeans для языков C/C++/Фортран+] |
| |=== |
| |
| Дополнительные сведения о загрузке и установки необходимого программного обеспечения см. в разделах link:../../../community/releases/80/install.html[+Инструкции по установки IDE NetBeans 8.0+] и link:../../../community/releases/80/cpp-setup-instructions.html[+ Настройка IDE NetBeans дляC/C++/Fortran+]. |
| |
| |
| == Настройка среды для учебного курса |
| |
| Для этого учебного курса потребуются модули Java и C/C++. Если комплект C/C++ IDE NetBeans уже загружен, пользователи могут загрузить дополнительные модули Java по отдельности. |
| |
| Чтобы определить наличие модулей Java и C/C++, выберите пункт меню "Файл > Новый проект". В категории проектов должны входить Java и C/C++. |
| |
| *Чтобы загрузить отсутствующие модули Java и C/C++, выполните следующие действия.* |
| |
| 1. В IDE NetBeans выберите 'Сервис' > 'Подключаемые модули'. |
| 2. Во вкладке "Доступные подключаемые модули" установите флажок для Java или C/C++ в зависимости от того, какой модуль отсутствует в среде IDE. Если оба модуля уже установлены, они отобразятся во вкладке "Установлено". |
| 3. Нажмите кнопку "Установить". |
| 4. Щелкните 'Далее' в диалоговом окне установщика IDE NetBeans, установите флажок принятия условий лицензии установщика и щелкните 'Установить'. |
| 5. По завершении установки нажмите кнопку "Готово". |
| |
| |
| == Настройка проекта приложения Java |
| |
| Для данной программы требуются проект Java и проект C. В этом разделе описаны создание и настройка проекта Java для разрабатываемого приложения JNI. Для этого потребуется создать проект приложения Java, инициализировать его главный класс и добавить метод в машинном коде к этому классу. |
| |
| 1. Выберите команду "Файл" > "Новый проект". Выберите категорию "Java" и тип проекта "Приложение Java". Нажмите 'Далее'. |
| |
| image::images/jni-new-project-java.png[] |
| |
| [start=2] |
| . В поле "Имя проекта" введите ``JNIDemoJava`` . |
| |
| [start=3] |
| . В качестве местоположения проекта можно указать любой каталог на компьютере. В этом примере используется папка по умолчанию "NetBeansProjects" в каталоге пользователя. |
| |
| [start=4] |
| . Не снимая флажок 'Создать основной класс', измените имя основного класса на ``jnidemojava.Main`` . |
| |
| image::images/jni-new-java-app.png[] |
| |
| [start=5] |
| . Нажмите 'Готово'. |
| |
| В среде IDE будет создана папка проекта ``NetBeansProjects/JNIDemoJava`` . |
| |
| |
| === Изменение исходного кода главного класса |
| |
| 1. Чтобы открыть источник класса Main в редакторе, щелкните правой кнопкой мыши узел класса ``Main.java`` и выберите 'Открыть'. |
| 2. Замените строку ``//TODO code application logic here`` в методе ``main`` следующим кодом: |
| |
| [source,java] |
| ---- |
| |
| new Main().nativePrint(); |
| ---- |
| |
| [start=3] |
| . В поле слева появится индикатор в виде лампочки, сообщающий об ошибке. Щелкните индикатор. Отобразится ярлык для создания метода ``nativePrint`` . |
| |
| [start=4] |
| . Щелкните этот ярлык, после чего будет вставлен следующий код: |
| |
| [source,java] |
| ---- |
| |
| private void nativePrint() { |
| throw new UnsupportedOperationException("Not supported yet"); |
| } |
| ---- |
| |
| [start=5] |
| . Удалите строку |
| |
| [source,java] |
| ---- |
| |
| throw new UnsupportedOperationException("Not supported yet"); |
| ---- |
| |
| [start=6] |
| . Измените метод ``nativePrint()`` : вставьте ключевое слово ``native`` в подпись метода, чтобы она выглядела следующим образом: |
| |
| [source,java] |
| ---- |
| |
| private native void nativePrint(); |
| ---- |
| |
| Ключевое слово ``native`` означает, что реализация этого метода размещена во внешней библиотеке в машинном коде. Однако при запуске местоположение библиотеки не ясно. |
| |
| Новый метод main будет выглядеть следующим образом: |
| |
| |
| [source,java] |
| ---- |
| |
| public static void main(String[] args) { |
| new Main().nativePrint(); |
| } |
| |
| private native void nativePrint(); |
| } |
| ---- |
| |
| [start=7] |
| . Правой кнопкой мыши щелкните имя проекта и выберите пункт "Очистить и собрать". После этого проект должен успешно собраться. |
| |
| |
| === Создание файла заголовка библиотеки в машинном коде |
| |
| В этом разделе будет использоваться ``javah`` – средство Java, используемое для создания заголовка на языке C из класса Java. |
| |
| 1. В окне терминала перейдите к каталогу ``NetBeansProjects`` . |
| 2. Введите следующее значение: |
| |
| [source,java] |
| ---- |
| |
| javah -o JNIDemoJava.h -classpath JNIDemoJava/build/classes jnidemojava.Main |
| |
| ---- |
| |
| В каталоге NetBeansProjects будет создан файл заголовка на языке C ``JNIDemoJava.h`` . Этот файл требуется для того, чтобы обеспечить предоставление правильного объявления функции для реализации метода ``nativePrint()`` в машинном коде. Он понадобится позже при создании части приложения на языке C. |
| |
| |
| [start=3] |
| . Переключение обратно в окно IDE NetBeans. |
| |
| *Заключение* |
| |
| В этом упражнении вы создали новый проект приложения Java, указали его местоположение и определили пакет и имя главного класса этого проекта. Вы также добавили новый метод к главному классу и пометили его как метод с реализацией в машинном коде. В завершение вы создали файл заголовка на языке C, который понадобится позже при компиляции библиотеки в машинный код. |
| |
| |
| == Настройка нового проекта динамической библиотеки на языке C/C++ |
| |
| В этом разделе рассматривается процесс создания части приложения в машинном коде. Вы создадите проект динамической библиотеки на языке C++ и настроите его для сборки кода JNI. |
| |
| После настройки проекта вы создадите реализацию для метода в машинном коде, который был объявлен ранее в части приложения на языке Java. |
| |
| 1. Выберите команду "Файл" > "Новый проект". В окне "Категории" выберите C/C++. В окне "Проекты" выберите "Динамическая библиотека C/C++". Нажмите кнопку "Далее". |
| |
| image::images/jni-new-project-c.png[] |
| |
| [start=2] |
| . В поле "Имя проекта" введите ``JNIDemoCdl`` . |
| |
| [start=3] |
| . В поле "Местоположение проекта" укажите то же местоположение, которое было использовано для проекта приложения Java – ``NetBeansProjects`` . Это местоположение должно отобразиться по умолчанию. |
| |
| [start=4] |
| . Оставьте данные во всех остальных полях без изменения и нажмите 'Готово'. |
| |
| В среде IDE будет создана папка проекта ``NetBeansProjects/JNIDemoCdl`` . |
| |
| |
| === Настройка свойств проекта |
| |
| 1. Правой кнопкой мыши щелкните узел проекта "JNIDemoCdl" и выберите "Свойства". |
| 2. В диалоговом окне свойств выберите узел "Компилятор C" в свойствах "Сборка" узла. |
| 3. Нажмите кнопку 'Включить каталоги и заголовки...'. В открывшемся диалоговом окне 'Включение каталогов и заголовков' нажмите 'Добавить'. |
| 4. Перейдите к каталогу JDK и выберите подкаталог ``include`` . |
| 5. Выберите параметр 'Сохранить путь как абсолютный', затем нажмите кнопку 'Выбрать', чтобы добавить этот каталог во включенные каталоги проекта. |
| 6. Аналогичным образом добавьте каталог JDK ``include/linux`` , затем нажмите кнопку "ОК". |
| |
| image::images/jni-include-directories.png[] |
| |
| Эти параметры требуются для включения ссылок на библиотеку Java ``jni.h`` из кода C. |
| |
| |
| [start=7] |
| . Найдите область 'Строка компиляции' в параметрах компилятора C. Щелкните текстовое поле в свойстве 'Дополнительные параметры' и введите ``-shared -m32`` . image:images/jni-project-properties-cmd-options.png[] |
| |
| Параметр ``-shared`` указывает создание динамической библиотеки. |
| Параметр ``-m32`` указывает создание двоичного файла для 32-разрядных платформ. По умолчанию в 64-разрядных системах компилируются двоичные файлы для 64-разрядных платформ, что приводит к возникновению множества проблем в 32-разрядных JDK. |
| |
| |
| [start=8] |
| . Перейдите в категорию "Компоновщик" на левой панели. |
| |
| [start=9] |
| . Поставьте курсор в текстовое поле "Вывод" и замените строку |
| |
| [source,java] |
| ---- |
| |
| ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libJNIDemoCdl.so |
| ---- |
| на строку |
| |
| [source,java] |
| ---- |
| |
| dist/libJNIDemoCdl.so |
| ---- |
| чтобы упростить путь к созданному файлу совместно используемого объекта. Это поможет упростить процесс создания ссылки из Java. |
| |
| image::images/jni-project-properties-linker.png[] |
| |
| [start=10] |
| . Нажмите кнопку "ОК". Определенные параметры сохранены. |
| |
| |
| === Добавление файла заголовка |
| |
| 1. Перейдите в окно терминала и переместите ранее созданный файл заголовка ``JNIDemoJava.h`` из каталога ``NetBeansProjects`` в каталог проекта библиотеки C/C++ – ``NetBeansProjects/JNIDemoCdl`` . |
| 2. |
| В окне 'Проекты' щелкните правой кнопкой мыши узел 'Файлы заголовка' проекта ``JNIDemoCdl`` и выберите 'Добавить существующий элемент'. Перейдите в каталог ``NetBeansProjects/JNIDemoCdl`` , выберите файл ``JNIDemoJava.h`` и нажмите 'Выбрать'. |
| |
| Файл ``JNIDemoJava.h`` появится в списке 'Файлы заголовка'. |
| |
| image::images/jni-source-files-include-file.png[] |
| |
| |
| === Реализация метода |
| |
| 1. Правой кнопкой мыши щелкните узел "Исходные файлы" проекта ``JNIDemoCdl`` , затем выберите пункт "Создать > Исходный файл C". Введите ``JNIDemo`` в поле "Имя файла", затем нажмите кнопку "Готово". В редакторе откроется файл ``JNIDemo.c`` . |
| 2. Измените файл ``JNIDemo.c`` , введя следующий код: |
| |
| [source,c] |
| ---- |
| |
| #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"); |
| |
| } |
| |
| ---- |
| |
| [start=3] |
| . Сохраните файл ``JNIDemo.c`` . |
| |
| [start=4] |
| . Щелкните правой кнопкой мыши узел проекта ``JNIDemoCdl`` и выберите 'Собрать'. В окне 'Результаты' отображается следующее (или аналогичное) сообщение: ``СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 171 мс)`` . |
| |
| *Заключение* |
| |
| В этом упражнении вы создали новую динамическую библиотеку C/C++, указали ее местоположение и настроили ее для сборки реализации JNI метода Java. Вы добавили созданный файл заголовка для метода в машинном коде, объявленного в приложении Java, и выполнили его реализацию. |
| |
| |
| == Сборка и запуск приложения |
| |
| В этом упражнении вы выполните ряд окончательных изменений в части приложения на языке Java. Эти изменения нужны, чтобы часть приложения на языке Java правильно выполнила загрузку библиотеки в машинном коде, скомпилированной в предыдущем упражнении. После этого вы выполните компиляцию созданного приложения и запустите его. |
| |
| |
| === Настройка проекта Java |
| |
| 1. Откройте файл ``Main.java`` в редакторе. |
| 2. Добавьте код инициализации для динамической библиотеки C++ после строки ``public class Main`` , используя путь к выходному файлу, укороченный в предыдущем упражнении: |
| |
| [source,java] |
| ---- |
| |
| static { |
| System.load("_full-path-to-NetBeansProjects-dir_/JNIDemoCdl/dist/libJNIDemoCdl.so"); |
| } |
| |
| ---- |
| Замените _full-path-to-NetBeansProjects-dir_ путем к каталогу NetBeansProjects, который должен иметь следующий (или аналогичный) вид: ``/home/_username_/NetBeansProjects`` |
| |
| [start=3] |
| . Сохраните файл ``Main.java`` . |
| |
| |
| === Запуск приложения JNIDemoJava |
| |
| 1. Выберите приложение JNIDemoJava в окне 'Проекты'. |
| 2. Чтобы запустить приложение, нажмите клавишу F6 или кнопку "Выполнить" на панели инструментов. Программа должна запуститься корректно, и в окне 'Результаты' должны отобразиться следующие (или аналогичные) данные: |
| |
| image::images/jni-build-success.png[] |
| |
| |
| === Заключение |
| |
| В этом упражнении вы выполнили окончательную настройку и запустили приложение, чтобы проверить, что реализация метода в машинном коде берется из библиотеки C, скомпилированной в машинный код. |
| |
| |
| == Что дальше? |
| |
| Чтобы проверить проект на рабочем примере, link:https://netbeans.org/projects/samples/downloads/download/Samples%252FCPlusPlus%252FJNIDemo.zip[+ загрузите файл ZIP, содержащий исходный код,+] с веб-сайта netbeans.org. |
| |
| Для получения дополнительной информации используйте следующие документы: |
| |
| * link:quickstart.html[+Краткий учебный курс по работе с проектами C/C+++] |
| * link:http://docs.oracle.com/javase/7/docs/technotes/guides/jni/[+Спецификация JNI+] |
| * link:http://en.wikipedia.org/wiki/Java_Native_Interface[+Интерфейс Java с машинным кодом (Java Native Interface)+] |
| link:https://netbeans.org/about/contact_form.html?to=7&subject=Feedback:%20Beginning%20JNI%20with%20NetBeans%20IDE%20and%20C/C++%20Plugin%20on%20Linux[+Отправить отзыв по этому учебному курсу+] |