Создание интерфейса Java из заголовочного файла C++

У нас есть некоторые проприетарные библиотеки, с которыми нам нужно взаимодействовать. Эти библиотеки представляют собой библиотеки DLL Windows или файлы Linux .so. У нас есть заголовки для определения интерфейсов. Поскольку я никогда ничего не делал с нативными библиотеками, я посмотрел JNAerator (http://code.google.com/p/jnaerator/) и материалы BridJ и JNA.

Какой простой способ использовать заголовочный файл C++ и скомпилированную библиотеку для создания интерфейса? Например, приняв JNA в целом с чем-то вроде:

SomeDLL lib = (SomeDLL) Native.loadLibrary("some_dll", SomeDLL.class);

Мне нужно где-то хранить DLL: как связать DLL с Jar? Я использую Maven для создания файла Jar... но интерфейс Native.loadLibrary не позволяет напрямую указывать путь.


person wishi    schedule 31.05.2011    source источник
comment
см. также stackoverflow.com/questions/3720563/   -  person David J. Liszewski    schedule 31.05.2011


Ответы (2)


Кодирование JNI обычно представляет собой ручной процесс написания кода C++ для создания собственных связующих методов. Есть целая книга, объясняющая это.

В некоторых случаях http://jna.java.net/ может автоматизировать или ускорить этот процесс, но не не рассчитывайте на это.

Вы не можете «связать нативные библиотеки», если не пойдете по пути использования OSGi или чего-то вроде инструмента упаковки Tanukisoft, в Java нет встроенной функции для этой цели.

Вы соединяете точки, используя -Djava.library.path, чтобы указать java, где найти собственные библиотеки, или используя API более низкого уровня для System.loadLibrary, которые позволяют указать полный путь.

Остерегайтесь взаимодействий с PATH и LD_LIBRARY_PATH, если ваши собственные библиотеки, в свою очередь, имеют зависимости.

person bmargulies    schedule 31.05.2011
comment
Многие люди полагаются на JNA для производственного использования, а теперь некоторые даже полагаются на BridJ. Оба они позволяют связывать нативный код и относительно плавно генерировать код благодаря JNAerator, при этом вообще не нужно писать нативный клей. - person zOlive; 23.09.2011

С BridJ вы можете связать DLL/.so/.dylib с JAR, но вы должны поместить его (или их) в определенный путь, зависящий от платформы, в JAR, который начинается с «org/bridj/lib/» и заканчивается идентификатором платформы + архитектуры.

Вот собственное исходное дерево BridJ, которое демонстрирует эту нативную схему связывания: каталог ресурсов org/bridj/lib

Если вы придерживаетесь этого соглашения, вам не придется иметь дело с PATH, LD_LIBRARY_PATH или извлечением файла: BridJ.register() (вызывается в @Library-аннотированном классе с собственными методами) сделает все это за вас!

person zOlive    schedule 23.09.2011