Elettracompany.com

Компьютерный справочник
3 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java add library

Подключение библиотек в Java

Библиотека — готовый набор классов и компонентов, который встраивают в программу, чтобы реализовать некий функционал. Например, в тысячах казуальных игр музыку можно проигрывать одним и тем же способом. Чтобы не тратить время на работу со звуком, программисту достаточно подключить подходящую библиотеку.

Подключение Джава-библиотек в Eclipse

Если вы пользуетесь средой разработки Eclipse, подключение библиотек в Java займёт у вас меньше минуты:

Разворачиваем дерево проекта в Package Explorer и находим папку libs. Если её нет — создаем.

Кладем нужный .jar в libs.

В появившемся окне выбираем «копирование файлов» (copy files) и жмём OK.

Обновляем проект: правый клик — «Refresh».

Классы подключены и готовы к вызову из нашей программы.

Подключение библиотек Java в Maven и Apache-Ant

Минус подключения библиотек через IDE в том, что для пересборки проекта на другой машине нужна та же среда. Чтобы не зависеть от среды, используют системы сборки Maven и Ant.

Чтобы «прикрутить» библиотеку к проекту Maven, нужно указать её среди зависимостей в файле pom.xml. С библиотекой может подтянуться еще несколько зависимостей, которые подключаются к этой библиотеке. В случае с jar этого не происходит.

Как будет выглядеть наш pom.xml:

Теперь при компиляции проекта библиотека войдет в конечный .jar-файл.

В Ant принцип схожий, но редактировать нужно файл build.xml. Путь к подключаемым библиотекам пишут с помощью тегов <classpath> и <path>. Сначала объясняем, где искать библиотеку:

И далее передаём этот адрес тегу <classpath>:

Как подключить Java-библиотеку вручную

Ваша IDE умеет подключать библиотеки, но как она это делает? Давайте посмотрим, что происходит на уровне файлов. Если библиотека написана на Джаве, её компоненты хранятся либо в архиве .jar, либо в исходниках .java. Более сложный вариант с интеграцией библиотек на C++ пока рассматривать не будем.

Подключение jar-библиотек в Java

Если на компьютере только одна версия Джавы — всё просто. Чтобы подключить .jar, достаточно положить его в папку lib директории Java на жестком диске. Виртуальная машина при ближайшем запуске сама возьмет код из библиотеки.

Когда вы используете одновременно несколько версий Java-машины, раскладывать файлы библиотек для каждой из них утомительно. Лучше указать путь к нужным классам с помощью ключа -classpath.

Открываем терминал и пишем:

java -classpath ./classes ru.аuthor.libname.Main

ru.аuthor.libname.Main — наша библиотека

Точкой перед «/» отмечают текущую директорию.

Можно перечислить несколько библиотек, код из которых компилятор соберет в порядке их перечисления:

java -classpath ./classes;./lib/l1-0.1.jar;./lib/l2-1.5.jar ru. аuthor.libname.Main

Теперь вы умеете подключать библиотеки даже в нестандартной ситуации: когда не установлена IDE или нужно скорректировать очередность подключения.

Библиотека — готовый набор классов и компонентов, который встраивают в программу, чтобы реализовать некий функционал. Например, в тысячах казуальных игр музыку можно проигрывать одним и тем же способом. Чтобы не тратить время на работу со звуком, программисту достаточно подключить подходящую библиотеку.

Подключение Джава-библиотек в Eclipse

Если вы пользуетесь средой разработки Eclipse, подключение библиотек в Java займёт у вас меньше минуты:

Разворачиваем дерево проекта в Package Explorer и находим папку libs. Если её нет — создаем.

Кладем нужный .jar в libs.

В появившемся окне выбираем «копирование файлов» (copy files) и жмём OK.

Обновляем проект: правый клик — «Refresh».

Классы подключены и готовы к вызову из нашей программы.

Подключение библиотек Java в Maven и Apache-Ant

Минус подключения библиотек через IDE в том, что для пересборки проекта на другой машине нужна та же среда. Чтобы не зависеть от среды, используют системы сборки Maven и Ant.

Чтобы «прикрутить» библиотеку к проекту Maven, нужно указать её среди зависимостей в файле pom.xml. С библиотекой может подтянуться еще несколько зависимостей, которые подключаются к этой библиотеке. В случае с jar этого не происходит.

Как будет выглядеть наш pom.xml:

Теперь при компиляции проекта библиотека войдет в конечный .jar-файл.

В Ant принцип схожий, но редактировать нужно файл build.xml. Путь к подключаемым библиотекам пишут с помощью тегов и

. Сначала объясняем, где искать библиотеку:

И далее передаём этот адрес тегу :

Как подключить Java-библиотеку вручную

Ваша IDE умеет подключать библиотеки, но как она это делает? Давайте посмотрим, что происходит на уровне файлов. Если библиотека написана на Джаве, её компоненты хранятся либо в архиве .jar, либо в исходниках .java. Более сложный вариант с интеграцией библиотек на C++ пока рассматривать не будем.

Подключение jar-библиотек в Java

Если на компьютере только одна версия Джавы — всё просто. Чтобы подключить .jar, достаточно положить его в папку lib директории Java на жестком диске. Виртуальная машина при ближайшем запуске сама возьмет код из библиотеки.

Когда вы используете одновременно несколько версий Java-машины, раскладывать файлы библиотек для каждой из них утомительно. Лучше указать путь к нужным классам с помощью ключа -classpath.

Открываем терминал и пишем:

java -classpath ./classes ru.аuthor.libname.Main

ru.аuthor.libname.Main — наша библиотека

Точкой перед «/» отмечают текущую директорию.

Можно перечислить несколько библиотек, код из которых компилятор соберет в порядке их перечисления:

java -classpath ./classes;./lib/l1-0.1.jar;./lib/l2-1.5.jar ru. аuthor.libname.Main

Теперь вы умеете подключать библиотеки даже в нестандартной ситуации: когда не установлена IDE или нужно скорректировать очередность подключения.

Как добавить собственную библиотеку в «java.library.path» с запуском Eclipse (вместо того, чтобы переопределять его)

83 Touko [2009-03-19 10:26:00]

У меня есть родная библиотека, которую нужно добавить в java.library.path. С аргументом JVM -Djava.library.path = path. Я могу установить путь по своему желанию.

Моя проблема в том, что моя другая библиотека (pentaho reporting) ищет шрифты на основе java.library.path по умолчанию (включая системные каталоги и т.д.), а ручная настройка переопределяет путь по умолчанию.

Итак: как я могу добавить запись пути в java.library.path по умолчанию вместо того, чтобы переопределять ее (что, кажется, выполняется с -Djava.library.path)? (Я бы не хотел добавлять путь по умолчанию вручную, что было бы неплохо для развертывания)

EDIT: Извините за отсутствующие данные; Я работаю с Eclipse. (Развертывание выполняется с помощью JNLP и там я могу использовать nativelib под ресурсами)

java eclipse path

13 ответов

41 Решение Touko [2010-02-22 11:44:00]

Забыл этот вопрос. Я действительно спрашивал у Eclipse, извините за то, что не сказал об этом изначально. И ответ кажется слишком простым (по крайней мере, с 3.5, вероятно, с более старыми версиями):

Конфигурация запуска Java Аргументы: аргументы VM:

Не забывайте кавычки, в противном случае возникают проблемы с пробелами в PATH.

Если вы хотите добавить собственную библиотеку, не вмешиваясь в java.library.path во время разработки в Eclipse (чтобы избежать включения абсолютных путей и необходимости добавления параметров в конфигурацию запуска), вы можете указать путь к месту расположения собственных библиотек для каждый Jar в диалоговом окне «Путь сборки Java» в папке «Собственная библиотека». Обратите внимание, что имя файла родной библиотеки должно соответствовать имени файла Jar. См. Также подробное описание.

SWT помещает необходимые библиотеки DLL в JAR. Найдите «org.eclipse.swt.win32.win32.x86_3.4.1.v3449c.jar» для примера.

DLL должны находиться в корне JAR, JAR должен быть подписан и DLL должна появиться с контрольной суммой в META-INF/MANIFEST.MF для VM, чтобы забрать их.

3 andy boot [2009-04-24 12:54:00]

В Windows, например:

-Djava.library.path = «C:/MyLibPath;% PATH%»

% PATH% — ваш старый -Djava.library.path

https://bugs.eclipse.org/bugs/show_bug.cgi?id=102239 утверждает, что механики замещения не реализована в заставке Eclipse, по крайней мере, до выпуска Juno.

Таким образом, (почти) невозможно добавить или добавить другую библиотечную папку в java.library.path при запуске Eclipse без предварительного уведомления о настройке по умолчанию.

Я написал почти, потому что должно быть возможно запустить запуск Eclipse, сбросить содержимое java.library.path и остановить Eclipse в одной команде. Дамп будет анализироваться, а затем приниматься за вход для запуска Eclipse, т.е.

Читать еще:  Javascript возвести в степень

1 Johan [2014-07-15 14:44:00]

Решение, предлагаемое Роб Элснером в одном из комментариев выше, отлично работает (OSX 10.9, Eclipse Kepler). Нужно добавить дополнительные пути к разделяемым «:».

Вы также можете использовать $ — Rob Elsner Ноя 22 ’10 в 23:01

1 Vadym [2010-11-26 11:20:00]

Окно- > Настройки- > Java- > Установленные JRE. Затем выберите текущий JRE (JDK) и нажмите «Изменить». Заполните аргументы VM по умолчанию: -Djava.library.path =/usr/local/xuggler/lib. Готово!

Можете ли вы обойти это, обратившись System.load() программно, чтобы загрузить свою родную библиотеку? Этот метод (в отличие от System.loadLibrary()) позволяет указать абсолютный путь.

По какой-то причине я не мог заставить работать несколько папок (ну, на какое-то время, но как только мне понадобилось больше dll и добавлено больше папок, ни один с пробелами в пути). Затем я скопировал все необходимые DLL файлы в одну папку и получил это как мой java.library.path, и он сработал. У меня нет объяснений — если кто-нибудь это сделает, было бы здорово.

0 geowa4 [2009-09-09 04:01:00]

В системах UNIX вы можете добавить к переменной среды LD_LIBRARY_PATH. В Windows JVM автоматически устанавливает системное свойство java.library.path в PATH; поэтому, если dll находится на вашем PATH, тогда вы настроены.

Многие из существующих ответов предполагают, что вы хотите установить это для конкретного проекта, но мне нужно было установить его для самого Eclipse, чтобы поддерживать интегрированную проверку подлинности для JDBC-драйвера SQL Server.

Чтобы сделать это, я выполнил эти инструкции для запуска Eclipse из командной строки Java вместо обычной пусковой установки. Затем я просто изменил это значение script, чтобы добавить аргумент -Djava.library.path в командную строку Java.

0 Dhana [2010-07-09 10:25:00]

Имя файла родной библиотеки должно соответствовать имени файла Jar. Это очень важно. Убедитесь, что имя jar и имя dll совпадают. Также, пожалуйста, см. Сообщение от Fabian Steeg Моя загрузка для jawin содержала разные имена для dll и jar. Это jawin.jar и jawin d.dll, обратите внимание на добавление ‘d’ в имя dll файла. Я просто переименовал его в jawin.dll и установил его как родную библиотеку в eclipse, как упоминалось в сообщении » http://www.eclipsezone.com/eclipse/forums/t49342.html»

-2 Alan [2013-08-08 22:46:00]

В Windows я обнаружил, что важно запустить Eclipse из командной строки, а не из меню «Пуск» или ярлыка при условии, что родная DLL находится в каталоге вашего PATH, По-видимому, это гарантирует, что соответствующий каталог находится на пути.

Adding Java Libraries to Netbeans 6.9

Netbean 6.9 ships with many Java libraries such as Ant, Hibernate and Junit just to mention a few. Undoubtedly There will be libraries that you need for your projects that are not included with the Netbeans distribution that you will want to Netbeans. This document will detail how to add Java libraries to Netbeans.

In this example we will add the Oracle 11gR2 JDBC drivers. Netbeans 6.9 includes JDBC drivers for MySQL, PostgreSQL but not Oracle. In order to use the Oracle JDBC drivers you will have to add them to Netbeans. The Oracle JDBC drivers are included with the Oracle Client and Database install or can be downloaded separately from the Oracle Technology Network (OTN).

Start up Netbeans and bring up the Library Manager which is found under the Tools menu.

The Library Manager is where you can add, modify, or delete libraries in Netbeans.

Click the New Library… button to start the process of adding the Oracle JDBC drivers.

Provide a name for the library. In this example we chose the name Oracle11gR2_JDBC. Library names cannot contain spaces. Next choose the library type. There are two library types to choose from. Class Libraries and Server Libraries. Server Libraries are application or web application libraries and Class Libraries are libraries are outside of the Java standard libraries such JDBC drivers along with any libraries that you might create. Choose Class Libraries as the Library Type and click the OK button.

You will now be taken back to the Library Manager dialog where you can add the location for the JDBC driver. There are three tabs in which you can use to set locations: Classpaths, Sources, and JavaDocs.

Classpaths Tab – Lists the jar files referenced by the library. Netbeans adds all referenced JAR files to the projects class path.
Sources Tab – The java source library is parsed by the code completion manager and is available to the Go To Source feature of the editor.
Java Docs Tab – The Javadoc library is parsed by the code completion manager and Javadoc library is available to the editor.

On the Classpaths Tab click the Add JAR/Folder… button. Browse to the location in which the JDBC driver is installed.

The Oracle 11gR2 driver includes JDBC drivers for both the 1.5 (ojdbc5.jar) and 1.6 (ojdbc6.jar) JDK. If your version of Netbeans 6.9 included the Java JDK then you have a 1.6 JDK and can select the ojdbc6.jar JDBC driver. Click the Add JAR/Folder button to continue.

Now that we have added the Oracle 11gR2 JDBC driver to the Library Manager we can now add the JDBC driver to a project. Right click the Libraries folder in the Project Navigator and select Add Library…

On the Add Library dialog select the Oracle JDBC driver

Click the Add Library button.

Once the library is added to the project code that depended on the library no longer shows an error and code completion is now available for Classes defined in the library

Now you are ready to connect an Oracle Database using JDBC and you now know how to add new libraries to Netbeans.

Share this:

13 thoughts on “Adding Java Libraries to Netbeans 6.9”

I need oracle 10g and (net beans 7.0) tutorial and eBook

connect oracle 10g to net beans 7.0
create database with java net beans and oracle

I’m using Netbeans 6.9 and I’ve followed the above to add a stand-alone jar.
However, when I right click on the Libraries in a project, there is no ‘Add Library’.
There is Add Dependency, but I can’t navigate to the library I created to hold my stand-alone jar.
Any suggestions

What type of project are you using? I am unable to recreate the issue you are experiencing. The closest I can get is when using a Java Project with Existing Sources. With that project, right clicking Libraries brings up a context menu and the Add Library is grayed out along with the other options.

Thanks for posting, I was getting frustrated trying to set up JDBC. This worked perfectly.

I added library successfully but when I built a jar and execute it ; it shows error , like how will the program know where to find its “external” library.

Hello someone pls help me! I have a project am trying to rebuild.the project contains icons and images but when i run the program, the images don’t appear in the output, and an error messages like this appears “Error Loading Theme:java.lang.ClassNotFoundException: com.birosoft.liquid.LiquidLookAndFeel” But in the project, i have a folder named ‘com’

I have a dll file,how i can add this to my project in netbeans

Читать еще:  Javascript int parse

i would like to connect netbeans 7.0 and oracle 10g can please tell me the way

hi sir,iam using net beans 6.7 version,jdk 1.6 and oracle 10 g xe iam writing jsp code,its properly running but they dont connect oracle how to connect oracle 10 g pls reply

. Welcome to IGI Switch .

COMPANY NAME:INFOTECH GLOBAL INDIA LIMITED

PROJECT NAME:DEVELOPER PERFORMANCE TRACKER

Analysis Engineers Information

Analysis_enginer
Id
First_Name
Last_Name
Sex
Age
Designation
Role

some errors are occuring

HTTP Status 500 –

type Exception report

description The server encountered an internal error () that prevented it from fulfilling this request.

exception
org.apache.jasper.JasperException: javax.servlet.ServletException: java.sql.SQLException: Io exception: The Network Adapter could not establish the connection
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:398)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause
javax.servlet.ServletException: java.sql.SQLException: Io exception: The Network Adapter could not establish the connection
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:852)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:781)
org.apache.jsp.ShowReport_jsp._jspService(ShowReport_jsp.java:173)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause
java.sql.SQLException: Io exception: The Network Adapter could not establish the connection
oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255)
oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387)
oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:414)
oracle.jdbc.driver.T4CConnection.(T4CConnection.java:165)
oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
java.sql.DriverManager.getConnection(DriverManager.java:582)
java.sql.DriverManager.getConnection(DriverManager.java:185)
org.apache.jsp.ShowReport_jsp._jspService(ShowReport_jsp.java:108)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.18 logs.

Java, как добавить файлы библиотеки в netbeans?

Я новичок в IDE Netbeans и Java. У меня есть проект java, который показывает много ошибок компиляции:

может кто-нибудь помочь мне с этими ошибками, Как добавить файлы библиотеки в IDE Netbeans?

3 ответов

быстрое решение в NetBeans 6.8.

в окне проекты щелкните правой кнопкой мыши имя проекта, которому не хватает библиотеки — > свойства — > откроется окно Свойства проекта. В дереве категорий выберите узел «библиотеки» — > в правой части окна свойств проекта нажмите кнопку» Добавить банку/папку » — > выберите нужные банки.

вы также можете увидеть мои короткие Видео How-To.

как импортировать общую библиотеку в netbeans.

оцените сообщение об ошибке в NetBeans:

NoClassDeffFoundError означает где-то под капотом в используемом коде метод, называемый другим методом, который вызвал класс, который не может быть найден. Так что это означает, что ваш код сделал это: MyFoobarClass foobar = new MyFoobarClass() и компилятор запутан, потому что нигде не определен этот MyFoobarClass. Вот почему вы получаете ошибка.

чтобы узнать, что делать дальше, вы должны внимательно посмотреть на сообщение об ошибке. Слова «org/apache / commons» позволяют вам знать, что это кодовая база, которая предоставляет необходимые инструменты. У вас есть выбор: либо вы можете импортировать все в Apache commons, либо вы можете импортировать только класс LogFactory, либо вы можете сделать что-то между ними. Например, просто получите бит ведения журнала Apache commons.

вы захотите пойти посередине дороги и получить commons-лесозаготовки. Отличный выбор, запустите google и найдите apache commons-logging . Первая ссылка ведет на http://commons.apache.org/proper/commons-logging/. Перейти к скачиванию. Там вы найдете самые современные из них. Если ваш проект был скомпилирован под древними версиями commons-logging, используйте те же самые древние, потому что если вы используете более новые, код может потерпеть неудачу, потому что новые версии отличающийся.

вы захотите загрузить commons-logging-1.1.3-bin.zip или что-то в этом роде. Прочтите, что говорит имя. Этот.zip означает, что это сжатый файл. commons-logging означает, что этот должен содержать желаемый класс LogFactory. средние 1.1.3 означает, что это версия. если вы компилируете для старой версии, вам нужно будет сопоставить их, иначе вы рискуете, что код не компилируется из-за изменений, вызванных модернизация.

загрузите этот zip. Распаковать его. Поиск вокруг вещей, которые заканчиваются в .jar . В netbeans щелкните правой кнопкой мыши проект, выберите Свойства, выберите библиотеки, нажмите «Добавить jar / folder» и импортируйте эти банки. Сохраните проект и повторите запуск, и ошибки должны исчезнуть.

двоичные файлы не включают исходный код, поэтому вы не сможете детализировать и видеть, что происходит при отладке. Как программисты, вы должны быть загрузка «источника» Apache commons и компиляция из источника, создание банок самостоятельно и импорт их для опыта. Вы должны быть достаточно умны, чтобы понять и исправить исходный код, который вы импортируете. Эти древние версии Apache commons могли быть скомпилированы под более старой версией Java, поэтому, если вы слишком далеко назад, они могут даже не компилироваться, если вы не компилируете их под древней версией java.

В Netbeans 8.2

1. Загрузите двоичные файлы из веб-источника. The Apache Commos в: [http://commons.apache.org/components.html][1] В этом случае вы должны выбрать «Logging» в компоненты меню и перейдите по ссылке для загрузки в выпускает часть. Прямой URL: [http://commons.apache.org/proper/commons-logging/download_logging.cgi][2] Для меня правильно скачать файл: commons-logging-1.2-bin.zip С файлы.

2. Распакуйте загруженный контент. теперь, вы можете увидеть несколько файлы jar внутри каталога, созданного из zip-файла.

3. Добавить библиотеку в проект. щелкните правой кнопкой мыши проект, выберите свойства и нажмите в библиотеках (в левой части). Нажмите кнопку «Добавить банку / папку». Пойти на предварительно распакуйте содержимое и выберите нужный файл jar. Clic в «Open»и нажмите»Ok». Библиотека загружена!

JNI взаимодействие Java с C/C++

Язык программирования Java, несмотря на имеющие место недостатки, является мощным и, главное, в большинстве случаев самодостаточным языком программирования. Под самодостаточностью понимается возможность написания программ, решающих какую-либо конкретную задачу без привлечения других языков программирования.

Однако иногда без использования вспомогательных средств создать полноценную программу согласно техническим требования невозможно. Например, необходимо воспользоваться кодом, который обеспечивает низкоуровневый доступ к «железу» компьютера, на котором выполняется программа. В языке программирования Java, который по своей идеологии является многоплатформенным, средства низкоуровневого доступа к аппаратной части просто-напросто не предусмотрены. С другой стороны, к моменту появления языка Java в мире программирования уже существовали колоссальные «залежи» программ и библиотек, позволяющих решать практически любые задачи, начиная от математических вычислений и заканчивая управлением сложными системами. Естественно, не замечать это богатство было бы просто неразумно.

Разработчики Java включили в язык возможность обращения из приложений к программам, реализованным на других языках программирования с использованием так называемых native-методов. Подсистема Java, реализующая данную возможность, называется JNI (Java Native Interface – интерфейс обращения к native-методам). К native методам следует прибегать в том случае, когда необходимо воспользоваться сторонней dll библиотекой, чтобы ускорить критичный алгоритм за счет оптимизированного кода на C/С++ или ассемблере. Например, для обработки потокового медиа, сжатия, шифрования и т.п.

Зачастую native-методы просты: они не вызывают исключений, не создают новые объекты в heap’e, не обходят stack, не работают с handle’ами и не синхронизованы. Можно ли для них не делать лишних действий? В статье будет затронуты вопросы о недокументированных возможностях HotSpot JVM для ускоренного вызова простых JNI методов.

Процедуры, обеспечивающие связь native-метода с программой Java, зависят от применяемой операционной системы и языка программирования, на котором native-методы реализованы. В статье рассматривается связь языка Java с библиотеками DLL операционных систем семейства Microsoft Windows. Рассмотрим простой вариант использования JNI. Пример показывает насколько несложно использовать данный механизм.

Пример использования JNI в java приложениях

Допустим, необходимо создать dll библиотеку, методы которой получают и обрабатывают текстовые и целочисленные значения. Результат обработки возвращается также в текстовом и целочисленном виде. Для решения данной задачи создаем проект jnicall-desk, в который включаем обычный класс JNICall.java с описанием методов. Реализация методов будет выполнена в библиотеке dll. На следующем скриншоте приведена структура проекта. Класс JNICallTest.java будет использоваться для тестирования методов библиотеки dll.

Листинг класса JNICall.java

Класс JNICall.java включает три метода, при описании которых указываем модификаторы native. Для загрузки библиотеки dll (JNICall.dll) используется системный вызов loadLibrary(). Необходимо отметить, что наименование загружаемой библиотеки указывается без расширения «.dll».

Читать еще:  Math atan2 java

Класс располагается в пакете com.example, и на это следует обратить пристальное внимание. Это очень важный момент, поскольку наименование пакета будет использовано в наименованиях методов в коде С/С++. Далее перемещать данный класс в другой пакет не следует; иначе не будет загружаться динамическая библиотека.

В проекте классы .java компилируются в директорию bin, где «раскладываются» по пакетам (поддиректориям). После компиляции класса JNICall получаем в проекте файл com.example.JNICall.class. Для создания файла с заголовком для C/C++ обработаем класс утилитой javah, которая создаст файл «com_example_JNICall.h».

Параметр classpath ссылается на директорию bin (-classpath bin). Для класса JNICall приводится полное имя : [package].[Class.name].

Листинг com_example_JNICall.h

В результате выполнения команды javah в корневой директории проекта (где была выполнена команда) будет создан файл com_example_JNICall.h следующего вида:

Следует обратить внимание на 2-ю строчку, в которой выполняется импорт файла . Месторасположение данного файла следует искать в JDK в директории include. На моем компьютере он располагается в директории
«C:Program FilesJavajdk1.8.0_131include». Файл «jni.h» потребовал дополнительно «jni_md.h» из поддиректории win32
(«C:Program FilesJavajdk1.8.0_131includewin32»).

Проект создания dll

Для создания библиотеки JNICall.dll был использован CodeBlocks, который «легко» устанавливается на компьютер. При создании проекта выбран тип «Dynamic Link Library», в который включен файл com_example_JNICall.h и добавлен файл com_example_JNICall.cpp. На следующем скриншоте представлен проект создания библиотеки из двух файлов.

Редактировать заголовок не следует; его необходимо включить в файл CPP (com_example_JNICall.cpp), который представлен ниже :

В коде класса com_example_JNICall.cpp следует обратить внимание на обработку строк. Целочисленные переменные обычно не так сложны. Текстовые же значения нужно «вытащить» из Unicode в обычный char.

Метод doMultiply возвращает значение произведения двух чисел. Метод doCombine — создает одну строку из двух строк. Метод getMessage к текстовой строке «Get text : » добавляет строку, полученную в качестве параметра.

Примечание : в Windows создаваемая библиотека будет называться JNICall.dll; в Linux она должна иметь наименование libJNICall.so, т.е. обязательно начинаться с префикса ‘lib’. Несмотря на то, что в Linux наименование библиотеки .so имеет префикс, при загрузке в LoadLibrary префикс не используется.

Класс тестирования JNI

Обратите внимание, что в проекте jnicall-desk созданная библиотека располагается в поддиректории «dll». Чтобы JVM могла найти эту библиотеку следует внести исправления в строку загрузки класса JNICall.java :

Это работает для standalone-приложения, но это НЕПРАВИЛЬНО. А если динамическую библиотеку необходимо будет использовать в WEB-приложении, то данный подход уже не сработает, библиотека не будет найдена и Вы увидите исключение java.lang.UnsatisfiedLinkError. ПРАВИЛЬНЫЙ подход — это использование «java.library.path», который работает как в standalone приложении, так и WEB-приложении. Пример использования JNI в сервлете WEB-приложения, включающего ajax-вызов библиотеки JQuery, можно увидеть здесь.

Коротко о java.library.path

«java.library.path» это, если можно так выразиться, аналог classpath, но только не для Java классов и *.jar файлов, а для нативных библиотек. Т.е. является свойством, которое указывает JVM, где искать нативные библиотеки. Свойство «java.library.path» устанавливается перед запуском java-приложения (читай JVM), через глобальные system properties, или как ключ -Dname=value. После этого оно становится read-only.

На просторах Интернета можно найти 2 примера как изменить данное свойство в run-time. Вы можете посмотреть первоисточник откуда получен следующий метод setLibraryPath :

Данный метод был протестирован, он рабочий, но мне, откровенно говоря, не очень понравился, поскольку обнуляет поля. В примере JNICallTest.java для тестирования JNI был использован второй метод addLibraryPath.

Листинг класса JNICallTest.test

В классе выполняется проверка наличия библиотеки dll в поддиректории. Если библиотека найдена, то добавляется путь к dll в переменную «usr_paths» загрузчика класса ClssLoader. Остальное все тривиально и прозрачно, особых комментариев не требуется. Помните, что в системный метод загрузки библиотеки loadLibrary в классе JNICall необходимо передать только ее наименование, т.е. использовать код : System.loadLibrary(«JNICall»).

В классе выполняется проверка наличия библиотеки в поддиректории, после чего определяется путь к директории и вызывается метод addLibraryPath, который добавляет этот путь в соответствующее свойство загрузчика. Далее вызываются native методы.

Результат выполнения программы выводится в консоль :

Исходный код примера можно скачать в конце страницы.

Особенности использования JNI

Но зачастую native методы просты: они не вызывают исключений, не создают новые объекты в heap’e, не обходят стек, не работают с хендлами и не синхронизованы. Можно ли для них не делать лишних действий?

Далее в статье будут рассмотрены недокументированные возможности HotSpot JVM для ускоренного вызова простых JNI методов.
Рассмотрим для примера простой native метод, получающий на вход массив byte[] и возвращающий сумму элементов. Есть несколько способов работы с массивом в JNI:

1. GetByteArrayRegion – копирует элементы Java массива в указанное место нативной памяти.

2. GetByteArrayElements – то же самое, только JVM сама выделяет область памяти, куда будут скопированы элементы. По окончании работы с массивом необходимо вызвать ReleaseByteArrayElements.

Здесь можно задаться вопросом:»Зачем делать копию массива?». Но ведь работать с объектами в Java Heap напрямую из натива нельзя, так как они могут перемещаться сборщиком мусора прямо во время работы JNI метода. Однако есть функция GetPrimitiveArrayCritical, которая возвращает прямой адрес массива в heap’e, но при этом запрещает работу GC до вызова ReleasePrimitiveArrayCritical.

Метод Critical Native

А вот и секретный инструмент. Внешне он похож на обычный JNI метод, только с приставкой JavaCritical_ вместо Java_. Среди аргументов отсутствуют JNIEnv* и jclass, а вместо jbyteArray передаются два аргумента: jint length – длина массива и jbyte* data – «сырой» указатель на элементы массива. Таким образом, Critical Native методу не нужно вызывать дорогие JNI функции GetArrayLength и GetByteArrayElements – можно сразу работать с массивом. На время выполнения такого метода GC будет отложен.

Как можно увидеть, в реализации не осталось ничего лишнего. Но чтобы метод мог стать Critical Native, он должен удовлетворять строгим ограничениям:

  • метод должен быть static и не synchronized;
  • среди аргументов поддерживаются только примитивные типы и массивы примитивов;
  • Critical Native не может вызывать JNI функции, а, следовательно, аллоцировать Java объекты или вызывать исключения;
  • метод должен завершаться за короткое время (самое главное), поскольку на время выполнения он блокирует GC.

Critical Natives задумывался как приватный API HotSpot’a для JDK, чтобы ускорить вызов криптографических функций, реализованных в native методе.

Важная особенность: JavaCritical_ функции вызываются только из горячего (скомилированного) кода, поэтому помимо JavaCritical_ реализации у метода должна быть еще и «запасная» традиционная JNI реализация. Впрочем, для совместимости с другими JVM так даже лучше.

Давайте, измерим, какова же экономия при работе с массивами разной длины: 16, 256, 4KB, 64KB и 1MB. Естественно, с помощью JMH.

Оказывается, для маленьких массивов стоимость JNI вызова в разы превосходит время работы самого метода! Для массивов в сотни байт накладные расходы сравнимы с полезной работой. Ну, а для многокилобайтных массивов способ вызова не столь важен – всё время тратится собственно на обработку.

Critical Natives – приватное расширение JNI в HotSpot, появившееся с JDK 7. Реализовав JNI-подобную функцию по определенным правилам, можно значительно сократить накладные расходы на вызов native метода и обработку Java-массивов в нативном коде. Однако для долгоиграющих функций такое решение не подойдет, поскольку GC не сможет запуститься, пока исполняется Critical Native.

Источник информации об особенностях использования JNI можно увидеть здесь.

Скачать пример

Рассмотренный на странице пример, включающий проект Eclipse с использованием JNI, можно скачать здесь (37.2 Кб). Библиотека JNICall.dll создана для windows x64.

Пример использования JNI в сервлете WEB-приложения можно увидеть здесь.

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector
×
×