1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/smirkcat-scalacpptest

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

JNI: тестирование локальных методов

Этот демонстрационный проект предназначен для тестирования взаимодействия Scala и Java с динамической библиотекой. Для работы с проектом рекомендуется использовать Eclipse или IntelliJ IDEA.

Перед началом работы необходимо настроить среду Scala (если вы не знаете, как это сделать, обратитесь к проекту loaddll). Пример пакета содержит программу на Scala, а jexample — программу на Java. Обе программы используют одну и ту же динамическую библиотеку.

Примечание: при тестировании Java-программы переместите её в каталог example, а программу на Scala — в jexample (в противном случае могут возникнуть конфликты, поэтому рекомендуется проводить тестирование отдельно для Java и Scala).

Структура каталогов:

  • src/main/scala — каталоги классов Java и Scala;
  • src/main/resources — каталог размещения динамической библиотеки;
  • Sample1 — исходный код динамической библиотеки, решение VS2013 и файл Cmakelists.txt.

Проект имеет две ветви:

  • main — основная ветвь (по умолчанию), содержащая базовые тесты;
  • loaddll — зависит от проекта loaddll, использует его метод загрузки динамической библиотеки.

Если ваша среда соответствует требованиям (Eclipse или IntelliJ), компиляция проходит успешно, то можно переходить к шагу 2. В противном случае начните с шага 1.

Шаг 1: компиляция Java и Scala байт-кода

Компиляция Java [Sample1.java] (src/main/scala/jexample/Sample1.java) (при тестировании обратите внимание на изменение имени пакета)

javac example/Sample1.java

Компиляция Scala [Sample1.scala] (src/main/scala/example/Sample1.scala)

scalac example/Sample1.scala

Шаг 2: создание заголовочного файла .h

Генерация .h для Java

Команда:

javah -classpath . -jni example.Sample1
# Необходимо упаковать и выполнить команду в каталоге над файлами классов, иначе вызов завершится неудачно. Параметр -jni можно опустить. Обратите внимание, что класс не должен заканчиваться на .class, иначе он не будет найден.

Создание .h для Scala (предварительно настроив среду Scala)

Команды для 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).

Шаг 3: компиляция динамической библиотеки

Для пользователей 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.

Шаг 4: вызов

Вызов из Eclipse:

Настройте, как показано на рисунке.

Или:

  1. Для Windows поместите библиотеку в C:\Windows\System32 (64-разрядная версия) или C:\Windows\SysWOW64 (32-разрядная версия).
  2. Для Linux поместите в /usr/lib или /usr/local/lib.
  3. Для Apple пока неизвестно.

Вызов через командную строку:

Добавьте путь к файлу динамической библиотеки в аргументы виртуальной машины.

Поместите библиотеку в текущий каталог выполнения команды 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 )

Вы можете оставить комментарий после Вход в систему

Введение

Пример учебника по JNI для кода на Java и Scala Тестирование вызова динамической библиотеки C/C++ Развернуть Свернуть
CMake и 4 других языков
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/smirkcat-scalacpptest.git
git@api.gitlife.ru:oschina-mirror/smirkcat-scalacpptest.git
oschina-mirror
smirkcat-scalacpptest
smirkcat-scalacpptest
main