Как я могу заставить работать отложенную / отложенную загрузку в Linux? - PullRequest
2 голосов
/ 02 марта 2012

У меня это отлично работает в Windows - приложение загружает мой плагин (C ++, Qt), мой плагин выполняет интеллектуальный поиск, чтобы найти установленную JRE, соответственно устанавливает путь поиска в библиотеке и затем вызывает функцию в JVM, котораяпринудительно загружает jvm.dll в этот момент.(Предыдущий вопрос: Как развернуть смешанное приложение на C ++ / Java (JNI)? )

Теперь я пытаюсь заставить его работать на Linux.Из того, что я прочитал, ленивое связывание / загрузка было по умолчанию, поэтому я подумал, что это будет просто работать ... не похоже на это.

Я бы хотел избежать dlopen() и dlsym(), LD_LIBRARY_PATH, ldconfig и т. Д. Идея состоит в том, что пользователи этого плагина не должны знать, как все это работает, они просто помещают plugin.so в нужное место, и когда он загружается, плагинимеет ум, чтобы найти JRE (или сказать пользователю установить JRE).

Можно ли это сделать?

РЕДАКТИРОВАТЬ

Просто длябыть ясным ... ошибка, которую я получаю при загрузке плагина: "Невозможно загрузить библиотеку /home/dan/blah/blah/libMyPlugin.so: (libjawt.so: невозможно открыть общий объектный файл: такого файла или каталога нет")

РЕДАКТИРОВАТЬ

Если это имеет значение ... это должно работать на Ubuntu 10.10 и выше, на CentOS 5.4 и OSX 10.6 +.

На Ubuntu 10.10 я сделал apt-get install openjdk-6-jdk, а затем, чтобы все работало правильно, мне пришлось

export LD_LIBRARY_PATH=
  /usr/lib/jvm/java-6-openjdk/jre/lib/i386:
  /usr/lib/jvm/java-6-openjdk/jre/lib/i386/client:
  /usr/lib/jvm/java-6-openjdk/jre/lib/i386/xawt

(переводы строки для удобочитаемости)

Но если у кого-то был другой JDK installed (например, Sun), тогда каталоги, вероятно, будут отличаться (?).

Ответы [ 2 ]

1 голос
/ 02 марта 2012

Как вы провели умный поиск по windows?В Linux есть несколько «нормальных» мест.

Много раз переменная окружения $ JAVA_HOME устанавливается на текущую JRE.

У меня нет готового доступа кво всех перечисленных вами системах, но в некоторых дистрибутивах у вас есть символическая ссылка / usr / java / latest, которая будет указывать на последнюю установленную версию.

В общем случае, если установлена ​​JRE, она, вероятно, будетв одном из / usr / lib / jvm *, / usr / java *, / usr / lib / java * или, возможно, в одном из указанных выше вариантов lib64.

Конечно, приведенные выше методыскорее всего, укажет на a JRE.Решить, какой из них использовать, может быть непросто, но если ваш код не полагается на последнюю и лучшую версию, вероятно, все будет в порядке.

Я полагаю, как часть просьбы вашего пользователя установить JRE, если можно 'Если вас не найдут, вы можете попросить их установить $ JAVA_HOME, поскольку это довольно стандартная практика.

Я не знаю надежного способа его работы на всех дистрибутивах, поскольку часть проблемы связана схарактер * nix распределений.Однако может быть дополнительное соглашение, которое я пропускаю.

0 голосов
/ 02 марта 2012

Если ваша программа просто запускает java /path/to/foo.jar, то решение для систем на основе Debian простое:

$ ls -l /usr/bin/java /etc/alternatives/java /usr/lib/jvm/java-6-sun/jre/bin/java | awk '{print $1, $8, $9, $10}'
lrwxrwxrwx /etc/alternatives/java -> /usr/lib/jvm/java-6-sun/jre/bin/java
lrwxrwxrwx /usr/bin/java -> /etc/alternatives/java
-rwxr-xr-x /usr/lib/jvm/java-6-sun/jre/bin/java  
$ 

java в /usr/bin/java является символической ссылкой на символическую ссылку на real JRE.

...