Я поддерживаю программное обеспечение, которое реализовано на 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.