Встраивание приложения Java, упакованного как изображение jlink, в приложение macOS - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь встроить приложение 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, но это не помогло.

Что я делаю не так?

1 Ответ

1 голос
/ 13 января 2020

Должно работать нормально. Если я создаю пользовательскую переменную c - JAVA_HOME (User-Defined Settings) и задаю ее так, чтобы она указала на jlink версию Java.

JAVA_HOME: $(HOME)/tmp/jdk-13-stripped

, а затем я добавляю: $(JAVA_HOME)/jdk-13-stripped/lib в качестве ресурса (он окажется внутри Resources dir конечного приложения), а затем я устанавливаю следующие настройки:

Run Search Paths:     @executable_path/../Resources/lib/server
Header Search Paths:  $(JAVA_HOME)/include and $(JAVA_HOME)/include/darwin
Library Search Paths: $(JAVA_HOME)/lib/server
Other Linker Flags:   -L$(JAVA_HOME)/lib/server -ljvm

и затем я запускаю код

> ./CallJVM
Hello from Java

Если я проверяю, какое изображение было загружено, оно берется из правильного местоположения

> lldb CallJVM
(lldb) image list
...
...
[  7] ....   .../Debug/CallJVM.app/Contents/Resources/lib/server/libjvm.dylib

Обновление

На тот случай, если кому-то понадобится видеоурок, относящийся к этой теме c, вот вам go: Встраивание JVM в комплект приложений MacOS (с использованием XCode)

...