Подключить dll к java
Так вот создаю.
Строка private native void ShowMessage(String msg); в соответствующем цвете и Java Virtual Machine Launcher
выдает
java.library.path - это путь к каталогу, где у тебя храниться твоя dll.
это если указывать через опцию -Djava.library.path (см. ссылку выше)
динамические библиотеки можно подключать из самого приложения:
Кроме того, имена функций в dll должны формироваться по определенному правилу(см. ссылку выше.)
1.the prefix Java_
2.a mangled fully-qualified class name
3.an underscore (“_”) separator
4.a mangled method name
5.for overloaded native methods, two underscores (“__”) followed by the mangled argument signature
The VM checks for a method name match for methods that reside in the native library. The VM looks first for the short name; that is, the name without the argument signature. It then looks for the long name, which is the name with the argument signature. Programmers need to use the long name only when a native method is overloaded with another native method. However, this is not a problem if the native method has the same name as a nonnative method. A nonnative method (a Java method) does not reside in the native library.
java.library.path - это путь к каталогу, где у тебя храниться твоя dll.
это если указывать через опцию -Djava.library.path (см. ссылку выше)
динамические библиотеки можно подключать из самого приложения:
Кроме того, имена функций в dll должны формироваться по определенному правилу(см. ссылку выше.)
1.the prefix Java_
2.a mangled fully-qualified class name
3.an underscore (“_”) separator
4.a mangled method name
5.for overloaded native methods, two underscores (“__”) followed by the mangled argument signature
The VM checks for a method name match for methods that reside in the native library. The VM looks first for the short name; that is, the name without the argument signature. It then looks for the long name, which is the name with the argument signature. Programmers need to use the long name only when a native method is overloaded with another native method. However, this is not a problem if the native method has the same name as a nonnative method. A nonnative method (a Java method) does not reside in the native library.
но никто не мешает написать свой враппер в виде DLL, оформленой соовтетствующим образом, и вызывать уже его методы. Это, конечно, скажется на производительности. Пример из книжки:
Java класс, использующий dll
Код враппера вызывающего функцию из целевой dll.
НА изучение уйдет много времени. Поэтому не примите за дерзость, прошу помощи в виде наставлений. Я не прошу написания кода, помогите просто подсказками. Может в результате получится какое нибудь руководство по использованию dll в Java. ДЛЯ ЧАЙНИКОВ.
Итак. У меня есть dll. И два файла *.h.
В первом список функций из dll, а другой состоит из конструкций типа и в нем описываются коды ошибок.
Теперь пытаюсь делать обвязку своей dll. Т.е. создам dll для Java, которая будет вызывать функции первой dll.
В Вorland С++ Builder 6 . Т.к моя dll работает с USB девайсом (содержит команды по управлению устройством), то выбираю
Пока писал пример вы уже почти разобрались :)
То, что бросилось в глаза:
Как вы собрираетесть из java передавать эту структуру в
Для нее надо бы заводить отдельный класс c native методами для доступа к полям и хранить в нем указатель на native структуру. Тогда при передаче экземпляра этого класса в native метод в качестве параметра сможете получить указатель на структуру и передать его в качестве параметра в нужную функцию.
Вот у нас есть java класс.
javac Native.java
javah Native
и получаем то, о чем мы с Вами говорим - Native.h:
С этим тоже разобрался. Наклепал
javac - это компилятор java.
Надо не javac -jni, а javah -jni
если запускать в D:\Native\ надо
javah -jni Native
-jni - нужен в java 1.4, а в 1.5 - эта опция включена по умолчанию.
Репутация: нет
Всего: 1
Репутация: 49
Всего: 171
Репутация: нет
Всего: 1
Репутация: нет
Всего: 1
Репутация: нет
Всего: 1
посмотри в tutorial-e
Репутация: 1
Всего: 44
PS Примеры взяты из Excelsior JET
Репутация: нет
Всего: 1
Репутация: 1
Всего: 44
Репутация: 51
Всего: 118
Можно сделать так:
Написать JNI вызов своей процедуры, котоая уже будет звать нужную dll (так называемый враппер/wrapper)
Репутация: нет
Всего: 1
AntonSaburov, что-то я не понял из этого примера как можно воспользоваться методами dll-ки. Точнее как использовать JNI понятно. Может подскажите методы на С++, чтобы с помощью jni мне вызвать метод dll
Может есть ещё какие-нибудь тулзы, чтобы решить эту задачу (вызвать функцию из dll написанную на С++)
Репутация: 51
Всего: 118
Репутация: нет
Всего: 1
Репутация: 51
Всего: 118
Репутация: нет
Всего: 1
Я сделал как в примере всё написано выдаёт ошибку
Репутация: 51
Всего: 118
Я просто ее всегда прописываю. Если нет - то надо использовать полные пути до файлов.
- Прежде, чем задать вопрос, прочтите это!
- Книги по Java собираются здесь.
- Документация и ресурсы по Java находятся здесь.
- Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
- Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
- Действия модераторов можно обсудить здесь.
- FAQ раздела лежит здесь.
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.
[ Время генерации скрипта: 0.1363 ] [ Использовано запросов: 21 ] [ GZIP включён ]
Собственный интерфейс Java (JNI) является одним из Интересный интерфейс от java By используя собственный интерфейс Java (JNI), вы может работать с другими приложениями и библиотеки .
JNI - это собственный программный интерфейс для java, который является частью JDK. Используя JNI, вы можете работать с другими приложениями и библиотеками, написанными на других языках, таких как C, C ++. Но возникает основной вопрос, когда мне следует использовать JNI?
- Вам нужна некоторая информация о платформе, а стандартная библиотека классов Java может не поддерживать платформенно-зависимые функции, необходимые вашему приложению.
- У вас есть библиотечное приложение, написанное на другом языке, и вы хотите использовать его в своем Java-приложении.
- Вы хотите, чтобы Java взаимодействовала с некоторым языком программирования низкого уровня.
Ниже приводится простой пример; Посмотрите, что у методов есть «родное» ключевое слово:
DLL, которую мы собираемся использовать, это firstJNI.DLL. Эта DLL может быть сгенерирована VC ++ или Borland. О чем мы поговорим позже.
Скомпилируйте приведенный выше код, используя (Что это значит?)
Затем создайте файл заголовка, используя (Что это значит?)
Это создаст файл firstJNI.h. В заголовке файла вы увидите
Не редактировать файл заголовка
Теперь посмотрим, как сгенерировать DLL с помощью VC ++. Нажмите: Файл-> Создать-> Библиотека Win32Dynamic-Link . Дайте имя и выберите Простой проект DLL У вас будет файл firstJNI.CPP Ниже приведен первый файл JNI.cpp
Теперь у меня есть вопросы о том, как я могу использовать файл .dll, написанный на C ++ / C, в моем java-приложении. Я разрабатываю приложение для Android с помощью Eclipse, и у меня есть файлы dll, и у меня нет их источника . Как я могу использовать их в своем проекте .
4 ответа
Сначала отказ от ответственности - я немного отрывочен по этому поводу, прошло много времени с тех пор, как я использовал JNI.
Многие примеры JNI предполагают, что вы владеете кодом для библиотеки, которую хотите вызвать, что, по моему опыту, бывает редко. В примере, который вы видите, javah util использовался для генерации файла заголовка, для которого была написана реализация cpp - вот почему вы можете увидеть файл заголовка jni и различные ключевые слова Java в файле cpp.
Чтобы использовать стороннюю dll, вам сначала понадобится документация для этой dll, без которой вы мертв в воде. Причина, по которой вам нужна документация, заключается в том, что вы собираетесь предоставить dll-оболочку, которая просто делегирует стороннюю dll - вам нужно знать, как ее вызывать и как выполнять любые сопоставления типов. Очевидно, что эта оболочка будет содержать все материалы JNI, позволяющие Java вызывать эту оболочку, которая, в свою очередь, вызывает стороннюю dll.
Есть разные способы сделать это, но самый простой из известных мне способов - использовать SWIG, который сгенерирует весь код C ++. требуется для обертки dll. Также полезно иметь под рукой кого-то, кто знает C ++ - они будут бесценными при написании файлов интерфейса (файлов .i или .swg), которые SWIG использует для генерации кода оболочки.
Эта статья предназначена для Simple Java, а не для Android:
В этом пошаговом руководстве мы покажем, как код C / C ++, скомпилированный в Windows DLL, может быть вызван из Java с помощью J / Invoke.
Мы будем использовать Microsoft Visual Studio 2005 для создания DLL с функциями C ++ и писать код Java с помощью Eclipse Java IDE. Действия для других IDE будут аналогичными. Мы рекомендуем вам выполнить это упражнение вместе с нами, даже если вы не очень хорошо знакомы с Visual Studio или Eclipse - это легко и весело!
Чтобы запустить этот пример, у вас должна быть Windows 2000, XP, Vista или 2003.
Для J / Invoke требуется комплект разработчика Java SE. Поскольку он использует аннотации Java, требуется JDK версии 5.0 или выше. Получите Java здесь.
Я не думаю, что вы сможете использовать собственную библиотеку Windows (.dll) в приложении для Android. Для загрузки на Android код необходимо встроить в .so.
Я разрабатываю приложение Java, которое должно быть выпущено как банку. Эта программа зависит от внешних библиотек С++, называемых JNI. Чтобы загрузить их, я использую метод System.load с абсолютным путем, и это отлично работает.
Однако я действительно хочу "спрятать" их внутри JAR, поэтому я создал пакет для их сбора. Это заставляет меня загружать относительный путь - путь пакета. Благодаря такому подходу я разрешаю пользователю запускать JAR в любом каталоге, не беспокоясь о необходимости связывать библиотеки DLL или скучать с предыдущим процессом установки.
Это генерирует ожидаемое исключение:
Исключение в потоке "main" java.lang.UnsatisfiedLinkError: ожидающий абсолютный путь библиотеки
Как я могу заставить это работать?
Подход к копированию DLL в папку (объясняется ниже) работает только при запуске в среде eclipse. Запуск экспортированного JAR, двоичные файлы DLL хорошо созданы, но загрузка JNI создает следующее исключение:
Исключение в потоке "main" java.lang.reflect.InvocationTargetException
Я запускаю этот метод загрузки:
Я думаю, что это может быть проблема с правами доступа, но не знаю, как ее решить. Как вы думаете?
ОТВЕТЫ
Ответ 1
Я не верю, что вы можете загрузить DLL непосредственно из JAR. Вы должны предпринять промежуточный шаг по копированию DLL из JAR. Следующий код должен сделать это:
Ответ 2
В основном это должно работать. Так как это делает JNA, просто загрузите его и изучите код. У вас даже есть некоторые подсказки, чтобы сделать эту платформу независимой.
JNA привносит свой собственный код в банку, распаковывает правильный двоичный файл во время выполнения и загружает его. Это может быть хорошей моделью (если я правильно понял ваш вопрос).
Ответ 3
Этот JarClassLoader, стремящийся решить ту же проблему:
Ответ 4
Вам нужно закодировать загрузчик классов с расположением DLL, но его можно загрузить без извлечения из банки. Достаточно простого перед выполнением вызова загрузки. В своем основном классе добавьте:
В частности, я столкнулся с той же проблемой с обработкой JNA и OSGi, как загружаются DLL.
Читайте также: