Я пытаюсь встроить приложение Java в собственное приложение Ma c. Приложение Java поставляется с jlink (Java 9+), включая урезанный JRE.
Я пытаюсь использовать интерфейс вызова Java для создания JVM и запуска основного класса, но программа падает в точке, где вызывается JNI_CreateJavaVM
, потому что она не может найти libjava.dylib
.
В моем проекте XCode у меня есть фаза «Копирование файлов», которая копирует все изображение Jlink (папка, содержащая каталоги bin
, lib
, et c.) в комплекте приложения, в каталог Contents/image
.
$ ls -l Java\ Native\ Wrapper.app/Contents/image/
total 8
drwxr-xr-x 11 ahs staff 352 Jan 13 12:46 bin
drwxr-xr-x 6 ahs staff 192 Jan 13 12:46 conf
drwxr-xr-x 25 ahs staff 800 Jan 13 12:46 legal
drwxr-xr-x 52 ahs staff 1664 Jan 13 12:46 lib
-rw-r--r-- 1 ahs staff 717 Jan 13 12:46 release
Файл dylib находится там:
$ file Java\ Native\ Wrapper.app/Contents/image/lib/libjava.dylib
Java Native Wrapper.app/Contents/image/lib/libjava.dylib: Mach-O 64-bit dynamically linked shared library x86_64
Моя цель- C код ссылки на библиотеку JNI в lib/jli/libjli.dylib
. Xcode автоматически копирует его в каталог Frameworks пакета приложения.
Когда я запускаю программу, я получаю следующую ошибку на консоли:
Error: could not find libjava.dylib
Failed to GetJREPath()
Я добавил каталог image/lib
к пути поиска во время выполнения. Проверка двоичного кода с помощью otool
подтверждает это:
$ otool -l Java\ Native\ Wrapper
...
Load command 18
cmd LC_RPATH
cmdsize 48
path @executable_path/../Frameworks (offset 12)
Load command 19
cmd LC_RPATH
cmdsize 48
path @executable_path/../image/lib (offset 12)
...
Я действительно озадачен здесь. Я пытался скопировать dylibs в каталог Frameworks, но это не помогло.
Что я делаю не так?