У меня есть библиотека ржавчины, которую я хочу вызвать из Java. Мне удалось создать соответствующий .h-файл и извлечь из него привязки Java. Пока структура моего проекта выглядит следующим образом, я могу получить доступ к c-функции при компиляции и запуске программы с помощью
javac --source=22 -d . src/my/panama/java/project/name/*.java
java --enable-native-access=ALL-UNNAMED Main.java
├── Cargo.lock
├── Cargo.toml
├── Main.java
├── my
│ └── panama
│ └── java
│ └── project
│ └── name
│ ├── projectPanamaFiles.class
├── libmy_rust.dylib
├── my_rust_lib.h
└── src
├── my
│ └── panama
│ └── java
│ └── project
│ └── name
│ ├── projectPanamaFiles.java
├── lib.rs
└── custom_functions.rs
Теперь я хочу интегрировать встроенную библиотеку в свой основной проект (Micronaut 4.4.2 и Java 22) со структурой следующего вида:
── src
└── main
├── java
│ └── my
│ └── panama
│ └── java
│ └── project
│ └── name
│ └── Application.java
└── rust
├── same As above
Когда я помещаю все файлы .class привязки Panama в src/main/java/my/Panama/java/project/name/library
, я могу использовать их в IntelliJ, как и любую другую библиотеку.
Когда я пытаюсь запустить свое приложение, оно терпит неудачу с java.lang.IllegalArgumentException: Cannot open library: libprocess_dlms.dylib
.
Я пробовал добавить его через gradle.kts через implementation(fileTree("src/main/rust"))
, но ничего не изменилось.
Кроме того, добавление его напрямую через System.load("/absolute/path/to/libmy_rust.dylib");
приводит к тому же сообщению об ошибке.
Где указать неправильный путь? Должен ли файл находиться в определенном месте? Есть ли способ заставить компилятор выводить данные о том месте, где он искал файл?
Я могу запускать программу, пока собственная библиотека находится в том же каталоге, что и мой основной класс. Всякий раз, когда я перемещаю библиотеку, она терпит неудачу с Cannot open library: libprocess_dlms.dylib
. Ничего не изменится, если я передам путь через -Djava.library.path
или помещу библиотеку по пути, указанному в DYLD_LIBRARY_PATH
. Загрузка через System.load("/absolute/Path")
не вызывает ошибку напрямую, но и ничего не меняет.
Мне не удалось каким-либо образом передать путь к библиотеке JVM/компилятору.
Передача через -Djava.library.path=/absolute/path/to/folder
не сработала так же, как загрузка через System.load(absolutePath)
или System.loadLibrary(libraryName)
.
Но если нативная библиотека размещена в корне проекта, где стоит build.gradle.kts
, она подхватывает ее автоматически.
Похоже, что где-то предопределено, что загружаемая библиотека должна находиться в корне проекта/"начальной точке" того, где вы выполняете свое приложение (выполните команду для запуска).
Теперь я приму свой ответ, но если кто-нибудь знает, как определить другое местоположение для собственной библиотеки, я буду рад это принять.
Загрузка библиотеки осуществляется операционной системой. Для Mac каталог, содержащий файл
libprocess_dlms.dylib
, должен быть добавлен в список путей в переменной средыDYLD_LIBRARY_PATH
. См. также раздел о загрузке библиотеки в руководстве по jextract: github.com/openjdk/jextract/blob/master/doc/…