JNI и Java: муравей вызывает или вызывает муравей?

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

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

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

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

18.08.2008 22:15:39
5 ОТВЕТОВ
РЕШЕНИЕ

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

3
18.08.2008 23:19:59
Задачи CPP отлично работали за то, что мне нужно, спасибо. В итоге мне потребовалась некоторая кросс-компиляция, но возможность указать, какой класс использовать для бэкэнда для cpptasks, решила это.
Free Wildebeest 14.09.2008 23:34:52

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

3
18.08.2008 22:36:49
JNA действительно выглядел как хороший способ делать то, что я хотел, но, к сожалению, мне пришлось начать создавать новые классы окон и вызывать функции для него, что не казалось возможным, поэтому мне пришлось вернуться к использованию JNI.
Free Wildebeest 14.09.2008 23:34:06

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

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

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

1
27.02.2010 04:46:12

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

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

1
17.09.2008 20:55:51

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

0
13.07.2009 18:40:01