JNI: тестирование локальных методов
Этот демонстрационный проект предназначен для тестирования взаимодействия Scala и Java с динамической библиотекой. Для работы с проектом рекомендуется использовать Eclipse или IntelliJ IDEA.
Перед началом работы необходимо настроить среду Scala (если вы не знаете, как это сделать, обратитесь к проекту loaddll). Пример пакета содержит программу на Scala, а jexample — программу на Java. Обе программы используют одну и ту же динамическую библиотеку.
Примечание: при тестировании Java-программы переместите её в каталог example, а программу на Scala — в jexample (в противном случае могут возникнуть конфликты, поэтому рекомендуется проводить тестирование отдельно для Java и Scala).
Структура каталогов:
Проект имеет две ветви:
Если ваша среда соответствует требованиям (Eclipse или IntelliJ), компиляция проходит успешно, то можно переходить к шагу 2. В противном случае начните с шага 1.
javac example/Sample1.java
scalac example/Sample1.scala
Команда:
javah -classpath . -jni example.Sample1
# Необходимо упаковать и выполнить команду в каталоге над файлами классов, иначе вызов завершится неудачно. Параметр -jni можно опустить. Обратите внимание, что класс не должен заканчиваться на .class, иначе он не будет найден.
Команды для Linux и Mac:
SCALA_LIB=$SCALA_HOME/lib
SCALA_CP=$SCALA_LIB/scala-library.jar:$SCALA_LIB/scala-reflect.jar
javah -cp $SCALA_CP:. example.Sample1
Команды для Windows:
SCALA_LIB=%SCALA_HOME%\lib
SCALA_CP=%SCALA_LIB%\scala-library.jar;$SCALA_LIB\scala-reflect.jar
javah -cp %SCALA_CP%;. example.Sample1
Обратите внимание: в Windows создаётся дополнительный файл .h.
Как показано на рисунке, результаты создания файлов .h в Linux и Windows различаются.
Пожалуйста, игнорируйте example_Sample1_delayedInit__body.h и используйте только файл [example_Sample1.h] (Sample1/Sample1.h) (для удобства переименования в Sample1.h). Затем создайте соответствующий файл C++ [Sample1.cpp] (Sample1/Sample1.cpp).
Для пользователей Windows рекомендуется использовать Visual Studio 2023. Откройте решение [Sample1.sln] в папке Sample1.
Компиляция для Linux:
g++ -dynamiclib -shared -fPIC \
-I/usr/include -I$JAVA_HOME/include -I$JAVA_HOME/include/linux \
Sample1.cpp -o Sample1.so
Компиляция для Mac OS:
g++ -dynamiclib -shared -fPIC \
-I/usr/include -I$JAVA_HOME/include -I$JAVA_HOME/include/darwin \
Sample1.cpp -o Sample1.dylib
Использование CMake: файл [CMakeLists.txt] (Sample1/CMakeLists.txt).
Для Linux и Mac используйте CMake.
Откройте терминал в папке Sample1, создайте папку build и перейдите в неё:
cd Sample1
mkdir build
cd build
cmake ..
make
Для Windows используйте CMake-GUI.
Следуйте инструкциям, показанным на рисунке.
Примечание: на данный момент Java и Scala используют один и тот же динамический библиотечный файл, поэтому, если вы считаете, что это сложно, рекомендуется использовать Java для написания кода и получения скомпилированного файла .h.
Вызов из Eclipse:
Настройте, как показано на рисунке.
Или:
Вызов через командную строку:
Добавьте путь к файлу динамической библиотеки в аргументы виртуальной машины.
Поместите библиотеку в текущий каталог выполнения команды java или добавьте -Djava.library.path=$(pwd) в команду java, где $(pwd) — это каталог, в котором находится Sample1.so (Linux), Sample1.dylib (Mac OS) или Sample1.dll (Windows).
Java-класс:
java -Djava.library.path=$(pwd) -cp . example.Sample1
scala -Djava.library.path=$(pwd) -cp . example.Sample1
Scala-класс:
SCALA_LIB_HOME=$SCALA_HOME/lib
SCALA_CP=$SCALA_LIB_HOME/scala-library.jar:$SCALA_LIB_HOME/scala-reflect.jar
java -Djava.library.path=$(pwd) -cp $SCALA_CP:. example.Sample1
В Windows замените символ $ на %% в аргументах командной строки.
Также прилагается информация о проекте javacpp и некоторых готовых библиотеках C++.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )