Обернутая JNI библиотека ищет неправильный рабочий каталог - как обойти? - PullRequest
1 голос
/ 16 декабря 2010

Я использую JNI, чтобы обернуть несколько встроенных функций в закрытый исходный код Библиотека PDF .Он имеет зависимый каталог fonts, который должен находиться в подпапке каталога вызывающего приложения .По моему опыту, поиск стандартен на основе текущего рабочего каталога .Таким образом, проблема.

При загрузке кода JNI в приложение Java текущий рабочий каталог является правильным.Тем не менее, каталог вызывающего приложения является каталогом java.exe bin.Я проверил, что помещение зависимой папки fonts в папку C:\Program Files (x86)\Java\jre6\bin работает как положено.

Библиотека, похоже, использует вызов C ++ GetCommandLine() или что-то подобное, чтобы определить, где должен находиться каталог fonts.Очевидно, это неприемлемое решение.

Я бы хотел избежать вызова внешнего EXE-файла.Но единственные обходные пути, которые я нашел, это:

  • Скомпилируйте EXE, поместите в каталог проекта Java и используйте Java Runtime.exec() для выполнения.(это работает работает)
  • Заставляет JNI-код запускать отдельный процесс, который выполняет те же действия, что и выше (не получает ничего, кроме усложнения)Я могу обойти эту проблему?Когда Java-приложения скомпилированы как исполняемый JAR-файл, является ли полученная командная строка все еще в JRE C:\Program Files\...java.exe?

1 Ответ

2 голосов
/ 16 декабря 2010

Создатель исполняемых файлов Java может создать исполняемый файл * .exe из вашего приложения Java без какого-либо собственного кодирования или компиляции. Вы можете поместить этот исполняемый файл, файлы JAR, шрифты и другие зависимости приложения в один установочный каталог.

Exe4j - один из создателей исполняемых файлов, который будет поддерживать это для Windows. Он не требует никаких предположений о текущем рабочем каталоге. Это важно в частом случае, когда вы не можете контролировать рабочий каталог при запуске приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...