JNI и Java: вызов муравья сделать или сделать вызов муравья?

Я собираюсь совершить свое первое путешествие в мир JNI (Java Native Interface), чтобы предоставить уведомления об изменении файловой системы из кода C / C++ для конкретной платформы на Java. Это если только кто-то не предложит какую-нибудь блестящую библиотеку для этого, которую я пропустил.

Будучи новичком в JNI, мне удалось найти много документации по интерфейсу и генерации библиотеки, но я не нашел много информации о создании собственной библиотеки.

У меня есть существующая сборка на основе ant для уже существующего источника Java, поэтому я пытаюсь понять, должен ли я заставить ant вызывать make для создания библиотеки или лучше всего заставить make вызывать ant после создания библиотека?

Ни один из вариантов не выглядит ужасно приятным, но оба кажутся лучше, чем пытаться заставить ant вызвать компилятор для компиляции кода и генерации библиотеки напрямую.

Ответов (5)

Решение

Мне очень не нравится make из-за неявного набора правил и обработки пробелов. Лично я бы использовал задачи cpp ( http://ant-contrib.sourceforge.net/cpptasks/index.html ) для компиляции на C. Они не такие гибкие, как make, но они также гораздо менее сложные, и это означает, что вам не нужно обременять своих разработчиков обучением make.

В качестве более простой альтернативы JNI попробуйте JNA: https://jna.dev.java.net/ , может решить эту проблему за вас и будет проще (при условии, что он может делать то, что вы хотите).

Я сейчас работаю над чем-то похожим. Имейте в виду, что использовать swig с swig.org часто проще, поскольку он генерирует заглушки для собственной библиотеки за вас.

Короткий ответ на ваш вопрос заключается в том, что файл ant должен запускать файл make после того, как библиотека java уже была построена, поскольку собственная библиотека зависит от сгенерированного заголовка swig, который создается из файлов классов java.

Если вы хорошо знакомы с ant и не хотите изучать новую систему, то http://ant-contrib.sourceforge.net/cpptasks/index.html , на который также ссылается другой автор, позволит вам создать C++ в муравей.

Я бы полностью пропустил JNI и использовал внешнюю программу, которая пишет уведомления на стандартный вывод. Затем Java может просто читать из потока вывода программы и генерировать любое необходимое событие. JNI - это слишком много работы, если все, что вам нужно, - это отправлять простые уведомления.

Кроме того, в Linux вы можете просто запустить «inotifywait» (с некоторыми подходящими параметрами, см. «Man inotifywait»).

Вы также можете попробовать задачи terp C++ в Codemesh . Они не бесплатны, но предлагают высокий уровень абстракции в сочетании с возможностью обнаруживать / указывать компилятор C++ и возможностью перебирать более одного компилятора / архитектуры процессора / конфигурации компилятора для многоплатформенных сборок.