Я бы пошел на какую-то форму IPC (каналы, может быть, даже сокеты). Таким образом, ваш
код сводится к копированию в и из байтовых массивов в C ++ и использовании
InputStreams и OutputStreams в Java.
Я недавно работал над проектом, в котором у нас была библиотека, распространяемая
третья сторона, которая была написана на C ++. Но каждая система, у нас есть это
Возможно, эта библиотека была написана на Java.
Мы пошли по пути упаковки библиотеки как собственного исполняемого файла,
который читает ввод из stdin, переводя его в вызовы функций
библиотека. Соответственно, результаты из библиотеки были преобразованы и
печатается на стандартный вывод.
Это также означало, что оболочку было легко проверить, так как все, что мне нужно было сделать
было вызвать его в командной строке. Обнаружил много ошибок и проблем
из-за этого. Тщательно рекомендую его.
Следующая проблема была «Как вызвать оболочку C ++» и «Как мне вызвать
упаковать его с помощью приложения Java? Мы фактически избежали ответов на эти
вопросы, выставляя исполняемый файл через inetd. Итак, наша Java
приложения вызывали код C, открывая сокет. Потому что я закодировал
обертка для связи через stdout и stdin, мне не нужно было изменять
это вообще , чтобы выставить его через TCP (читайте inetd , если вы озадачены).
Самое маленькое программирование, которое я когда-либо делал ...: -)
Извините, я пошел по касательной там. Я пытался проиллюстрировать
гибкость, которую вы можете получить, если решите разделить код C ++ на
отдельный процесс. Дело в том, что вы выполнили работу по сортировке
ваши структуры данных заранее. Итак, изначально вы могли бы сохранить свой другой
обрабатывать локально и общаться с ним по каналу. Дело в том, если вы
когда-нибудь решите, что вам нужно отправлять запросы на удаленный TCP-сервер,
это не займет много усилий, чтобы изменить программу Java. Вы имеете
уже проделал основную часть работы. Возможно, стоит задуматься.
Подходит ли вам это на самом деле, я не знаю.
Я не кодировал JNI, но у нас есть приложения, которые используют его на работе, и
все они страдают от проблем с управлением памятью:
1) Если код C / C ++ допускает ошибку с арифметикой указателя, ваш Java
приложение также облажалось. Вероятно, он умрет с SIGSEGV. Так что ваши
Код C / C ++ лучше быть надежным, хорошо протестированным и заслуживающим вашего доверия. С
Проект, над которым я работал, большинство приложений Java были серверными процессами,
которые должны работать 24/7. Мы не доверяли этой третьей стороне
библиотека это много, полезная она может быть.
2) Передача структур данных между Java и C ++ может быть проблематичной.
Особенно, если вы передаете объекты Java в функции C. Вы, как правило
должны выполнить какое-то преобразование, которое поднимает такие вопросы, как
я должен скопировать эту структуру данных? Когда мне его уничтожить? Это
особенно плохо, если вы случайно назвали «свободным» какой-то объект, который был
выделяется в программе Java.
3) Я видел некоторый код JNI. Это выглядит ужасно ... [barf]
Извините за длинный пост.