Поскольку вы выходите из контекста PHP в собственную оболочку, у вас будет много отладочных проблем.
Самый лучший и самый надежный, который я использовал в прошлом, - это запись вывода скрипта в файл журнала и его хвост во время выполнения PHP.
<?php
shell_exec("filename > ~/debug.log 2>&1");
Затем в отдельной оболочке:
tail -200f ~/debug.log
Когда вы выполняете свой PHP-скрипт, ваши ошибки и вывод из вашего вызова оболочки будет отображаться в вашем файле debug.log
.
Я уверен, что путь к классам и путь поиска разделяемой библиотеки имеют мало общего с друг другом. Согласно JNI Book (который, по общему признанию, старый), в Windows, если вы не используете системное свойство java.library.path
, DLL должна находиться в текущем рабочем каталоге или в каталоге, указанном в Windows PATH
.
Обновление:
Похоже, что Oracle удалил PDF со своего веб-сайта. Я обновил ссылку выше, чтобы указать на экземпляр PDF, который живет в Техасском университете в Арлингтоне.
Кроме того, вы также можете прочитать HTML-версию Oracle спецификации JNI , Это живет в разделе Java 8 веб-сайта Java и, надеюсь, будет некоторое время.
Обновление 2:
По крайней мере, в Java 8 (я не знаю, t проверены более ранние версии), вы можете сделать:
java -XshowSettings:properties -version
, чтобы найти путь поиска совместно используемой библиотеки. Посмотрите на значение свойства java.library.path
в этом выходе.
В моей ситуации я пытался запустить веб-сервис java в Tomcat 7 через разъем в Eclipse. Приложение работает хорошо, когда я развернул файл войны на экземпляр Tomcat 7 на моем ноутбуке. Для приложения требуется драйвер jdbc типа 2 для «IBM DB2 9.5». По какой-то нечетной причине соединитель в Eclispe не мог видеть или использовать пути в переменных среды IBM DB2, чтобы добраться до DLL-файлов, установленных на моем ноутбуке, как клиент jcc. В сообщении об ошибке либо указано, что ему не удалось найти файл db2jcct2 dll, либо ему не удалось найти зависимые библиотеки для этого DLL-файла. В конечном итоге я удалил соединитель и перестроил его. Затем он работал правильно. Я добавляю это решение здесь как документацию, потому что мне не удалось найти это конкретное решение в другом месте.
Имели идентичную проблему с машиной XP при установке javacv
и opencv
в сочетании с Eclipse. Оказалось, что мне не хватало следующих файлов:
Как только они были установлены, проект скомпилирован и работает нормально.
Если вы загружаете 32-разрядную версию вашей DLL с 64-разрядной JRE, у вас может возникнуть проблема. Это был мой случай.
chromedriver.exe
- драйвером Selenium для Chrome, который, насколько я могу судить, представлен только в 32-разрядной версии.
– SantiBailors
16 December 2016 в 11:31
У меня была такая же проблема, и я пробовал все, что было опубликовано здесь, чтобы исправить это, но никто не работал для меня. В моем случае я использую Cygwin для компиляции dll. Кажется, что JVM пытается найти JRE DLL на виртуальном пути Cygwin. Я добавил путь виртуального каталога Cygwin к DLL JRE, и теперь он работает. Я сделал что-то вроде:
SET PATH = "/ cygdrive / c / Program Files / Java / jdk1.8.0_45";% PATH%
blockquote>
Проверьте правильность пути к вашей библиотеке или нет. Конечно, вы можете использовать следующий код для проверки пути к пути к вашей библиотеке: System.out.println(System.getProperty("java.library.path"));
Вы можете назначить java.library.path при запуске приложения Java:
java -Djava.library.path=path ...
Я нашел отличную статью некоторых друзей в сейфе, которые прошли через то же самое, что и я. Это сработало для меня, поэтому, надеюсь, это поможет вам! Прочитайте, если вам интересно ( Опасности загрузки собственных библиотек на Android ) или просто используйте
compile 'com.getkeepsafe.relinker:relinker:1.2.3'
и замените
System.loadLibrary("myLibrary");
с
ReLinker.loadLibrary(context, "mylibrary");
Я хочу сообщить об этом интересном случае, попробовав весь вышеперечисленный метод, ошибка все еще существует. Странно, что это работает на компьютере под управлением Windows 7, но в Windows XP это не так. Затем я использую хост зависимостей и обнаружил, что в Windows XP нет VC ++ Runtime в качестве требования к моей DLL. После установки VC ++ Runtime package здесь он работает как шарм. Меня беспокоило то, что он продолжает говорить. Невозможно найти зависимые библиотеки, в то время как интуитивно зависит от JNI-зависимой dll, однако, наконец, получается, что зависимая от JNI dll требует другого зависимого dl. Надеюсь, это поможет.
Visual C++ Redistributable for VS2012
VSU_4\vcredist_x64.exe
или VSU_4\vcredist_x84.exe
в зависимости от конфигурации вашей системы dll
в папку lib
вместе с вашими другими библиотеками (например, \lib\win32-x86\your dll files
). У меня была точно такая же проблема, и, наконец, она была решена.
Я поместил все зависимые DLL в ту же папку, где был сохранен mylib.dll, и убедитесь, что JAVA Compiler смог его найти (если в пути компиляции нет mylib.dll, будет ошибка сообщая об этом во время компиляции). Важно отметить, что вы должны убедиться, что все зависимые библиотеки имеют одну и ту же версию с mylib.dll, например, если ваша версия mylib.dll является версией, тогда вы также должны поместить в нее версию всех зависимых библиотек ,
Надеюсь, это поможет другим, кто столкнулся с одной и той же проблемой.
Вам нужно загрузить свою библиотеку JNI.
System.loadLibrary загружает DLL из пути JVM (путь к bin JDK).
Если вы хотите загрузить явный файл с помощью пути, используйте System.load ()
См. также: Разница между System.load () и System.loadLibrary в Java
CLASSPATH
вообще не используется. Я не уверен, чтоcwd
используется вообще.java.library.path
или простоPATH
. @dB ', то место, где у вас есть, теперь wrong i>. – Ernest Friedman-Hill 23 May 2011 в 04:41