2009-04-20 2 views
4

Hat jemand erfolgreich eine C++ - API in Java oder .NET "eingepackt"? Ich habe eine Anwendung, die eine C++ API zum Schreiben von Plug-Ins bietet. Was ich tun möchte, ist Zugriff auf diese API von .NET oder Java.Eine C++ - API in Java oder .NET zusammenfassen

Müsste ich COM verwenden, oder gibt es einfachere/bessere Alternativen?

Antwort

9

Wenn Sie sehr einfache Methodensignaturen haben (dh Methoden, die primitive Typen wie int, char [], void * ... usw. akzeptieren und zurückgeben), ist es in .NET und noch immer relativ einfach möglich, aber ein bisschen schwieriger in Java mit JNI.

Wenn jedoch Ihre Klassenmethoden moderne C++ - Programmiertechniken wie Boost Shared Pointer und STL-Container verwenden, ist das eine ganz andere Geschichte. Sie müssen in diesem Fall sehr vorsichtig mit der Speicherverwaltung sein.

EDIT: Es wird noch interessanter sein, wenn die Methode C++ - Vorlage Argumente hat, weil C++ Vorlage System unterscheidet sich sehr von C# oder Java-Generics in dem es nur eine Kompilierzeit Mechanismus ist. Grundsätzlich bedeutet dies, dass die Signatur der Methode oder Klasse jedes Mal anders ist, wenn Sie einen anderen Datentyp an das Template-Argument übergeben. Dies machte es unmöglich, die Methode in C# oder Java einzubinden.

1

Auf der Java-Seite gibt es viele Optionen hier .. this question ist eigentlich ziemlich nah an dem, was Sie suchen, vorausgesetzt Ihre API kann in einer DLL, com oder ActiveX-Objekte eingerahmt werden.

Ich persönlich verwendet JIntegra, um API-Aufrufe in Office (Word) zu wickeln und verwendet es direkt in Java. Es brauchte ein wenig Hacking, um die gewünschte Funktionalität zu bekommen, aber letztendlich haben wir es zum Laufen gebracht. Das Fideln war tatsächlich auf der Word-Seite, die tatsächliche Integration war relativ einfach.

2

Ich denke, dass Sie möglicherweise etwas ähnliches wie die Java Native Inferface fragen Sie können Code in Sprachen wie C++ geschrieben aufrufen. Ich habe aber nie damit gearbeitet. Aber Sie können es überprüfen. Ich hoffe es hilft.

0

Ich bin der Hauptautor auf SlimDX. Es ist vielleicht nicht das größte Open-Source-Interoperabilitätsprojekt auf dem Markt, aber bei 150K + -Linien im gesamten Projekt ist es ziemlich umfangreich. Es wurde mit C++/CLI geschrieben, einer von Microsoft entwickelten Sprache, die weitgehend mit C++ kompatibel ist und die das Erstellen von Wrappern ermöglicht. Es funktioniert sehr gut, mit der Einschränkung, dass es nur Windows ist. Mono wird es nicht nehmen. Ich weiß nicht, was für ein Problem Sie haben, aber es ist wahrscheinlich eine bessere Alternative als COM. Leider gibt es viele Tipps und Tricks, die man sich grundsätzlich selbst einfallen lassen muss. Ich wollte über viele SlimDX-Blogs bloggen, aber irgendwie komme ich nie dazu.

Auf der Java-Seite glaube ich, dass Sie JNI verwenden müssen. Viel Glück damit. Ich habe noch nie mit jemandem gesprochen, der mit JNI gearbeitet hat, ohne dass wir beide darüber gelacht haben, auf eine Art, die so schlimm ist.

1

Die Verwendung von SWIG zur Handhabung des JNI-Krams macht das Wrappen einer cpp-API und die Verwendung von Java ziemlich schmerzlos.

Hier ist ein SWIG tutorial

0

I-Software beizubehalten, die in C implementiert ++ sondern muss Oberflächen in mehreren Sprachen wie Java und .NET, sondern auch delphi und VB6 einschließlich. Außerdem muss es auf mehreren Plattformen laufen (Java muss also unter Unix arbeiten).

Die Art und Weise, wie es gemacht wurde, war, eine einzelne DLL zu verwenden, die normale C-Funktionen exportiert, die primitive Typen verwenden. Um zum Beispiel eine Klasse Foo gegeben:

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); 
} 

dann Ihre JNI/.NET/VB6/Delphi Code implementiert sprachspezifische Klassen-Wrapper, aber diese C-DLL-Funktionen aufrufen. Jeder Klassenwrapper enthält einen Handle und gibt ihn an die C-Funktionen weiter.

Das funktioniert ganz gut, weil die meisten Sprachen dazu neigen, C als den kleinsten gemeinsamen Nenner zu verwenden. Solange Sie Ihre Schnittstellen über einen dünnen CAPI exportieren können Sie Schnittstellen für andere Sprachen erstellen.

Wir exportieren ein C (und nicht C++) api in der DLL, weil Funktionssignaturen plattformübergreifend viel standardisierter sind.

Vergessen Sie nicht, dass Sie in C# und Java mit Multibyte-String-Encoding umgehen müssen, also sollten Sie herausfinden, wie Sie Ihre Strings zu/von Ihrem C++ - Code transcodieren. Dazu gehört normalerweise, dass Sie über Gebietsschemata Bescheid wissen, oder Sie können UTF-8 kostengünstig unterstützen.

Verwandte Themen