Генерация Java-интерфейса из заголовочного файла C ++ - PullRequest
4 голосов
/ 31 мая 2011

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 31 мая 2011

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

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

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

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

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

0 голосов
/ 23 сентября 2011

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

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

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

...