// 
//     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.



image::images/netbeans-stamp-80-74.png[title="Содержимое этой страницы применимо к IDE NetBeans 7.4 и 8.0"]

|===
|-  |<<requirements,Требования>> 

|-  |<<modules, Настройка среды для учебного курса>> 

|-  |<<javaproject,Настройка проекта приложения Java>> 

|-  |<<c-library, Настройка нового проекта динамической библиотеки на языке C/C++>> 

|-  |<<running,Сборка и запуск приложения>> 

|-  |<<next,Следующие действия>> 
|===


== Требования

*Для работы с этим учебным курсом требуется следующее программное обеспечение и ресурсы.*

|===
|Программное обеспечение или материал |Требуемая версия 

|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[]
2. В поле "Имя проекта" введите  ``JNIDemoJava`` .
3. В качестве местоположения проекта можно указать любой каталог на компьютере. В этом примере используется папка по умолчанию "NetBeansProjects" в каталоге пользователя.
4. Не снимая флажок 'Создать основной класс', измените имя основного класса на  ``jnidemojava.Main`` .

image::images/jni-new-java-app.png[]
5. Нажмите 'Готово'. 

В среде IDE будет создана папка проекта  ``NetBeansProjects/JNIDemoJava`` .


=== Изменение исходного кода главного класса

1. Чтобы открыть источник класса Main в редакторе, щелкните правой кнопкой мыши узел класса  ``Main.java``  и выберите 'Открыть'.
2. Замените строку  ``//TODO code application logic here``  в методе  ``main``  следующим кодом:

[source,java]
----

new Main().nativePrint();
----
3. В поле слева появится индикатор в виде лампочки, сообщающий об ошибке. Щелкните индикатор. Отобразится ярлык для создания метода  ``nativePrint`` .
4. Щелкните этот ярлык, после чего будет вставлен следующий код:

[source,java]
----

private void nativePrint() {
      throw new UnsupportedOperationException("Not supported yet");
   }
----
5. Удалите строку

[source,java]
----

throw new UnsupportedOperationException("Not supported yet");
----
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();
}
----
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.

3. Переключение обратно в окно IDE NetBeans.

*Заключение*

В этом упражнении вы создали новый проект приложения Java, указали его местоположение и определили пакет и имя главного класса этого проекта. Вы также добавили новый метод к главному классу и пометили его как метод с реализацией в машинном коде. В завершение вы создали файл заголовка на языке C, который понадобится позже при компиляции библиотеки в машинный код.


== Настройка нового проекта динамической библиотеки на языке C/C++

В этом разделе рассматривается процесс создания части приложения в машинном коде. Вы создадите проект динамической библиотеки на языке C++ и настроите его для сборки кода JNI.

После настройки проекта вы создадите реализацию для метода в машинном коде, который был объявлен ранее в части приложения на языке Java.

1. Выберите команду "Файл" > "Новый проект". В окне "Категории" выберите C/C++. В окне "Проекты" выберите "Динамическая библиотека C/C++". Нажмите кнопку "Далее". 
image::images/jni-new-project-c.png[]
2. В поле "Имя проекта" введите  ``JNIDemoCdl`` .
3. В поле "Местоположение проекта" укажите то же местоположение, которое было использовано для проекта приложения Java –  ``NetBeansProjects`` . Это местоположение должно отобразиться по умолчанию.
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.

7. Найдите область 'Строка компиляции' в параметрах компилятора C. Щелкните текстовое поле в свойстве 'Дополнительные параметры' и введите  ``-shared -m32`` . image::images/jni-project-properties-cmd-options.png[]

Параметр  ``-shared``  указывает создание динамической библиотеки.
Параметр  ``-m32``  указывает создание двоичного файла для 32-разрядных платформ. По умолчанию в 64-разрядных системах компилируются двоичные файлы для 64-разрядных платформ, что приводит к возникновению множества проблем в 32-разрядных JDK.

8. Перейдите в категорию "Компоновщик" на левой панели.
9. Поставьте курсор в текстовое поле "Вывод" и замените строку

[source,java]
----

${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libJNIDemoCdl.so
----
на строку

[source,java]
----

dist/libJNIDemoCdl.so
----
чтобы упростить путь к созданному файлу совместно используемого объекта. Это поможет упростить процесс создания ссылки из Java.
image::images/jni-project-properties-linker.png[]
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");

}

----
3. Сохраните файл  ``JNIDemo.c`` .
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`` 
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[+Отправить отзыв по этому учебному курсу+]
