Завершение C ++ API в Java или .NET - PullRequest
4 голосов
/ 20 апреля 2009

Кто-нибудь успешно "завернул" C ++ API в Java или .NET? У меня есть приложение, которое предоставляет C ++ API для написания плагинов. Я хотел бы получить доступ к этому API из .NET или Java.

Нужно ли использовать COM или есть более простые / лучшие альтернативы?

Ответы [ 7 ]

9 голосов
/ 20 апреля 2009

Если у вас есть очень прямые сигнатуры методов (т. Е. Методы, которые принимают и возвращают примитивные типы, такие как int, char [], void * ... и т. Д.), Это достаточно просто сделать в .NET и все еще возможно но немного сложнее в Java с JNI.

Однако, если ваши методы класса используют современные методы программирования C ++, такие как повышение общих указателей и контейнеров STL, тогда это совсем другая история. В этом случае вам нужно быть очень осторожным с управлением памятью.

EDIT: Будет еще интереснее, если у метода есть аргументы шаблона C ++, потому что система шаблонов C ++ сильно отличается от обобщений C # или Java тем, что это всего лишь механизм времени компиляции. По сути, это означает, что сигнатура метода или класса меняется каждый раз, когда вы передаете другой тип данных в аргумент шаблона. Это сделало метод невозможным для переноса в C # или Java.

2 голосов
/ 20 апреля 2009

Я думаю, что вы можете спросить что-то похожее на Собственный интерфейс Java Он позволяет вам вызывать код, написанный на таких языках, как C ++. Я никогда не работал с этим, хотя Но вы можете проверить это. Надеюсь, это поможет.

1 голос
/ 20 апреля 2009

Использование SWIG для обработки JNI делает обертку cpp API и использование его из Java совершенно безболезненным.

Вот учебник SWIG

1 голос
/ 20 апреля 2009

Если вы собираетесь использовать .NET, я бы порекомендовал создать оболочку C ++ / CLI . C ++ / CLI позволяет смешивать управляемый код .NET с собственным кодом C ++ . У этого подхода есть некоторые хитрости, но в большинстве случаев он работает очень хорошо.

Запись в Википедии также имеет несколько хороших ссылок.

1 голос
/ 20 апреля 2009

Со стороны Java здесь есть много вариантов .. этот вопрос на самом деле довольно близок к тому, что вы ищете, если ваш API может быть упакован в объекты DLL, com или activex.

Я лично использовал JIntegra для упаковки вызовов API в офис (Word) и использовал его непосредственно в Java. Чтобы получить желаемую функциональность, потребовался некоторый взлом, но в итоге мы заставили его работать. На самом деле игра была на стороне Word, фактическая интеграция была относительно простой.

0 голосов
/ 20 апреля 2009

Я поддерживаю программное обеспечение, которое реализовано на C ++, но должно иметь интерфейсы на нескольких языках, включая Java и .NET, а также с Delphi и VB6. Кроме того, он должен работать на нескольких платформах (поэтому Java должна работать на Unix).

То, как это было сделано, состояло в том, чтобы использовать одну DLL, экспортирующую простые функции C с использованием примитивных типов. Например, учитывая класс Foo:

long MY_EXPORT_FLAG FooCreate()
{
    return (long)new Foo();
}

void MY_EXPORT_FLAG FooDestroy(long Handle)
{
   delete (Foo*)Handle;
}

void MY_EXPORT_FLAG BarMethod(long Handle, const char* pStr1, long* pReturnValue)
{
   *pReturnValue = ((Foo*)Handle)->BarMethod( pStr1 );
}

Тогда ваш код JNI / .NET / VB6 / Delphi реализует обертки классов для конкретного языка, но вызывает эти функции Cllll. Каждый класс-оболочка будет содержать дескриптор и передавать его в функции C.

Это работает довольно хорошо, потому что большинство языков склонны использовать C в качестве наименьшего общего знаменателя, поэтому, пока вы можете экспортировать свои интерфейсы через тонкий API, вы можете создавать интерфейсы для других языков.

Мы экспортируем API C (а не C ++) в DLL, потому что сигнатуры функций намного более стандартизированы для разных платформ.

Не забывайте, что в C # и Java вам придется иметь дело с многобайтовым кодированием строк, поэтому вы должны выяснить, как перекодировать ваши строки в / из вашего кода C ++. Как правило, это подразумевает знание локалей, или вы можете сэкономить и просто поддерживать UTF-8.

0 голосов
/ 20 апреля 2009

Я ведущий автор SlimDX . Возможно, это не самый крупный проект по взаимодействию с открытым исходным кодом, но при 150 000 строк в проекте он довольно существенный. Он написан с использованием C ++ / CLI, который является языком, разработанным Microsoft, в значительной степени совместимым с C ++, который предназначен для создания оболочек. Это работает очень хорошо, с оговоркой, что это только Windows. Моно не выдержит. Я не знаю, насколько это вас беспокоит, но, вероятно, это лучшая альтернатива, чем COM. К сожалению, есть много советов и приемов, которые вы должны придумать сами. Я собирался написать о многих из них, которые мы используем в SlimDX, но почему-то я так и не дошел до этого.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...