Java system loadlibrary android

Java System.loadLibrary() – Syntax & Examples

In this tutorial, we will learn about the Java System.loadLibrary() function, and learn how to use this function with the help of examples.

loadLibrary(String libname)

System.loadLibrary(libname) loads the native library specified by the libname argument.

Make sure the library file is present in any of the path specified by java.library.path.

Syntax

The syntax of loadLibrary() function is

loadLibrary(String libname)
Parameter Description
libname The name of library.

The function returns void.

Example 1 – loadLibrary(libname)

In this example, we will load a dll present in the Java library path.

awt.dll is present in the location C:\Program Files\Java\jre-10.0.1\bin . And this location is part of java.library.path .

Java Program

Loading Library. Library Loaded.

Example 2 – loadLibrary() – With Extension

In this example, we will provide the extension as well for the library name to loadLibrary() method. loadLibrary() throws java.lang.UnsatisfiedLinkError . So, do not provide the extension in the library name.

Java Program

Loading Library. Exception in thread "main" java.lang.UnsatisfiedLinkError: no awt.dll in java.library.path: [C:\Program Files\Java\jre-10.0.1\bin, C:\WINDOWS\Sun\Java\bin, C:\WINDOWS\system32, ., .] at java.base/java.lang.ClassLoader.loadLibrary(Unknown Source) at java.base/java.lang.Runtime.loadLibrary0(Unknown Source) at java.base/java.lang.System.loadLibrary(Unknown Source) at Example.main(Example.java:5)

Example 3 – loadLibrary(libname) – Null libname

In this example, we will pass null as argument for library name to loadLibrary() method. loadLibrary() throws java.lang.NullPointerException . Make sure that the library name is not null.

Java Program

Loading Library. Exception in thread "main" java.lang.NullPointerException at java.base/java.lang.Runtime.loadLibrary0(Unknown Source) at java.base/java.lang.System.loadLibrary(Unknown Source) at Example.main(Example.java:5)

Example 4 – loadLibrary(libname) – Library not present

In this example, we will try to load a library which is not present anywhere in the Java library paths. In such cases, loadLibrary() throws java.lang.UnsatisfiedLinkError .

Java Program

Loading Library. Exception in thread "main" java.lang.UnsatisfiedLinkError: no nolib in java.library.path: [C:\Program Files\Java\jre-10.0.1\bin, C:\WINDOWS\Sun\Java\bin, C:\WINDOWS\system32, ., .] at java.base/java.lang.ClassLoader.loadLibrary(Unknown Source) at java.base/java.lang.Runtime.loadLibrary0(Unknown Source) at java.base/java.lang.System.loadLibrary(Unknown Source) at Example.main(Example.java:5)

Conclusion

In this Java Tutorial, we have learnt the syntax of Java System.loadLibrary() function, and also learnt how to use this function with the help of examples.

Источник

JNI Часть 1: Введение

Всем привет! Меня зовут Роман Аймалетдинов и я разрабатываю клиентское приложение Ситимобил. Решил написать небольшую серию из трех статей по JNI, так как технология используется редко, но иногда она бывает очень полезной. Несмотря на то, что я разрабатываю классические приложения под Android, иногда хочется посмотреть технологии рядом со своей специализацией.

Что такое JNI?

JNI — это интерфейс, позволяющий из Java вызывать нативные функции. Например, метод С++, который что-нибудь делает. Допустим, мы пишем большую программу на простом и любимом Java или Kotlin, и нужно реализовать задачу коммивояжера для нашего клиента. Или мы пишем генетический алгоритм, который ищет что-то в большом объёме данных, и так уж вышло, что у нас есть замечательная реализация на С++. Особенно часто я слышу про JNI в gamedev- и в automotive-проектах. Однажды я работал в таком, будучи ещё интерном, и, точно не помню, но в общих чертах на С++ было много низкоуровневого кода по обработке потока данных, получаемого со спутника. JNI позволяет вручную управлять памятью. Можно написать фрагмент кода на C/С++, и при необходимости дёргать нативный метод и получать из него результат вычисления.

И ещё по поводу производительности: мы все знаем, что С/С++ побыстрее будут, и тогда получается, что мы сможем оптимизировать наши алгоритмы на Java, переписав их на C++. (спойлер: не надо, скорее всего, будет работать медленнее). Некоторые авторы в интернете говорят про увеличение производительности, поэтому в своей третьей статье я приведу тесты JNI/NDK и мы сможем сверить производительность.

Также для Android есть инструмент NDK, который всё про то же — запуск нативного кода и увеличение производительности отдельных алгоритмов.

NDK — Native Development Kit (для Android).
JNI — Java Native Interface (общий интерфейс).

Шаги для запуска кода из JNI

Шаг 1. Создадим новый проект ex: JNI_aymaletdinov_roman.

Шаг 2. Создадим класс, у которого будут native-методы, и назовём его AwesomeLib.

System.loadLibrary(«nativeLib»); — это статический метод, который загружает native-библиотеку из файловой системы в память и делает её экспортированные функции доступными для нашего Java-кода. То есть мы загружаем файл на С/С++, который будет выполнять сложные вычисления. Однако nativeLib мы ещё не создали, сделаем это позже.

Шаг 3. Следующим шагом нам необходимо объявить метод, помеченный ключевым словом native. Он не имеет реализации в Java, напишем её на C++.

public class AwesomeLib < static < System.loadLibrary("nativeLib"); >public native void helloHabr(); //

Шаг 4. Вызовем из Main нашу библиотеку, которая что-то делает в native-коде .

Шаг 5. На Java мы всё сделали! Теперь начинается что-то непривычное: нужно обязательно установить MinGW-w64, иначе не на чем будет компилировать нативный код. При установке выберите x86-64 и пропишите bin переменные среды path.

Шаг 6. Затем необходимо написать реализацию нашего нативного метода на C++. В этом языке объявление и реализация обычно хранятся в файлах .h и .cpp соответственно. Открываем консоль; переходим в папку, в которой будут лежать native-файлы; генерируем заголовок для натива командой javac -h . absolutePath/MyClass.java.

После выполнения команды будет создано два файла: .h и .class .

Декомпилированный .class мало интересен, а вот .h — что-то не из нашего JVM-мира. На самом деле всё очевидно: наш метод сгенерировался таким, каким он будет в С++. При этом имя функции генерируется автоматически с использованием полного имени пакета, класса и метода. Кроме того, мы получаем два параметра, передаваемых нашей функции:

/* DO NOT EDIT THIS FILE - it is machine generated */ #include /* Header for class nativelib_AwesomeLib */ #ifndef _Included_nativelib_AwesomeLib #define _Included_nativelib_AwesomeLib #ifdef __cplusplus extern "C" < #endif /* * Class: nativelib_AwesomeLib * Method: sayHello * Signature: ()V */ JNIEXPORT void JNICALL Java_nativelib_AwesomeLib_helloHabr(JNIEnv *, jobject); #ifdef __cplusplus >#endif #endif

Шаг 7. Следующий шаг — создание .cpp . То есть мы сами создаём файл с расширением .cpp и копируем из .h контракт метода. Я назвал файл тем же именем, что и Java-класс: AwesomeLib.cpp .

#include "nativelib_AwesomeLib.h" #include JNIEXPORT void JNICALL Java_nativelib_AwesomeLib_helloHabr(JNIEnv* env, jobject thisObject)

Шаг 8. Затем наш нативный код надо скомпилировать. Когда мы выполним в консоли команду g++ -c -I»C:\Program Files\Java\jdk-12.0.1\include» -I»C:\Program Files\Java\jdk-12.0.1\include\win32″ AwesomeLib.o.cpp -o AwesomeLib.o , появится ещё один файл: .o .

Смотрим на дерево проекта и видим новый файл:

Шаг 9. Осталось совсем немного. Теперь нужно сгенерировать .dll с названием нативной библиотеки, которое мы указали в статике в Java. В консоли выполняем команду: g++ -shared -o nativeLib.dll AwesomeLib.o -Wl,—add-stdcall-alias .

Смотрим, в IDE появился ещё один сгенерированный файл.

Шаг 10. Всё! Хочется запустить нашу программу с нативным кодом, но IDEA сейчас этого сделать не сможет. Она ничего не знает про С++, следовательно, для запуска воспользуемся консолью:
java -cp . -Djava.library.path=»[Абсолютный путь до папки, где лежит dll]» Main.java

Обратите внимание, что я перед запуском выполнил команду cd .. для того, чтобы быть в той же папке, где лежит запускаемый мною файл Main .

Как запустить проект из IDEA, а не через консоль?

Так как IDEA по умолчанию не знает ни о каких .dll , она не сможет запустить наш проект по нажатию на треугольник “Run”. Чтобы запустить проект, нужно прописать VM options в меню “Edit configurations”.

У нас появится поле VM options, и мы добавляем Djava.library.path full-width «>

Вот теперь точно всё! Можно запускать проект из IDEA и радоваться жизни.

Заключение

Краткий список шагов, чтобы было проще вспоминать тем, кто знает, читал и делал, но что-то подзабыл и нужна шпаргалка:

  • Установить MinGW-w64. При установке выбрать x86-64 и прописать bin переменные среды path.
  • Создать NativeLib.java с native-методами.
  • Перейти в консоли в папку (ex: src), в которую хотите сохранить сгенерированные файлы.
  • Выполнить javac -h . AwesomeLib.java .
  • Выполнить g++ -c -I»C:\\Program Files\\Java\\jdk-12.0.1\\include» -I»C:\\Program Files\\Java\\jdk-12.0.1\\include\\win32″ AwesomeLib.cpp -o AwesomeLib.o .
  • Выполнить g++ -shared -o nativeLib.dll AwesomeLib.o -Wl,—add-stdcall-alias .
  • Запустить программу: java -cp . -Djava.library.path=”Путь до папки с .dll» Main (или через студию).

Если вы внесли изменения в .cpp , то заголовок пересоздавать не нужно, но если вы изменили контракт метода, то придётся начинать с этапа javac -h . . .

В следующей части я расскажу про более сложные методы в JNI, про передачу List и вызов Java из C++.

Источник

Читайте также:  Тип данных uint8 python
Оцените статью