2016-04-05 2 views
1

Я скомпилировал приложение Java (JAR), которое отлично работает на моей машине Mac OS. Он использует JNI для вызова скомпилированной библиотеки C-Shared и использует jnr-ffi для загрузки этого собственного кода.Невозможно загрузить приложение JNI, связанное с Raspberry Pi

Я получаю кучу ошибок, которые возникают из-за попытки инициализации jnr-ffi. Похоже, что должны быть некоторые jni-файлы, которые должны существовать в системе как часть установки Java, но они не существуют.

Я не могу скопировать StackTrace дословно, но вот некоторые из ошибок, которые должны быть полезны:

Exception in thread "main" j.l.UnsatisfiedLinkError: could not load FFI provider jnr.ffi.provider.jffi.provider 


Another unsatisfied link error below: /tmp/...gibberish..so cannot open shared object file: no such file or directory. 

Another unsatisfied link error: Can't load library: /usr/lib/libjffi-1.2so 

В основном кучу ошибок, связанных загрузки нативного кода.

Это не стоит также ничего, что я извлек JAR, что я пытаюсь запустить, и он содержит кучу папок, такие как arm-Linux, Darwin, i386-Linux, и файл libjffi-1.2.so Так это выглядит, как файлы существует в ЕАО но во время выполнения у jave возникают проблемы с их поиском.

Я не могу понять, как это исправить, и это сработало на моей другой машине. Как исправить?

Я пробовал работать с sudo.

ответ

1

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

Тот, который вам нужен для малины pi, является arm-Linux.

Вам просто нужно выяснить, какой путь использует JVM для загрузки библиотеки, а также истребитель настроить программное обеспечение для загрузки надлежащего, через командную строку или заменить тот, который вы используете в маке, с одним скомпилированным для ARM.

+0

Спасибо, я попробую это. Но, с помощью поиска в каталоге/tmp со случайным именем filename.so? – conor

+0

Одним из путей поиска в исключении является допустимый путь. Почему это? – conor

+0

Java имеет концепцию временной папки. В исходном коде java программист может попытаться разрешить библиотеку. Возможно, он пытается распаковать некоторый архив, содержащий библиотеку в папке tmp, но поскольку архив не существует, извлеченный файл не будет существовать. (просто huessing здесь) – snovelli