blob: 599cd3ef2cac686186aeca268635002e9eed1edc [file] [log] [blame]
//
// 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[+Отправить отзыв по этому учебному курсу+]