2009-04-20 5 views
4

誰かがJavaまたは.NETでC++ APIを「ラップアップ」できましたか?私はプラグインを書くためのC++ APIを提供するアプリケーションを持っています。私がしたいのは、.NETやJavaからそのAPIにアクセスすることです。Javaまたは.NETでのC++ APIのラップアップ

私はCOMを使用する必要がありますか、より簡単で優れた選択肢がありますか?

答えて

9

非常にストレートなメソッドシグネチャ(int、char []、void * ...などのプリミティブ型を受け取って返すメソッド)を使用している場合は、可能ですが、JNIを使​​用するJavaでは少し難しくなります。

しかし、あなたのクラスメソッドがブースト共有ポインタやSTLコンテナなどの最新のC++プログラミングテクニックを使用している場合、それは非常に異なる話です。この場合、メモリ管理には本当に注意が必要です。

EDIT: C++テンプレートシステムはC#やJavaジェネリックとは非常に異なるため、このメソッドにはC++テンプレート引数があると面白いでしょう。基本的に、これは、メソッドまたはクラスのシグネチャが、異なるデータ型をテンプレート引数に渡すたびに異なることを意味します。これにより、メソッドをC#またはJavaでラップすることが不可能になりました。

1

ここでは多くのオプションがあります。this questionは、DLL、com、またはactivexオブジェクトにあなたのAPIを格納することができれば、あなたが探しているものにかなり近いです。

私は個人的にJIntegraを使用してAPI呼び出しをoffice(Word)にラップし、Javaで直接使用しました。それは望ましい機能を得るためにいくつかのハッキングを取ったが、我々はそれを機能させるようになった。実際には、Word側では、実際の統合は比較的簡単でした。

2

あなたは、Java Native Inferfaceと似たようなことを聞​​いているかもしれないと思います。C++などの言語で書かれたコードを呼び出すことができます。私はそれで働いたことはありません。しかし、あなたはそれをチェックしたいかもしれません。それが役に立てば幸い。

0

私はSlimDXの主著者です。そこでは最大のオープンソースの相互運用性プロジェクトではないかもしれませんが、プロジェクト全体では150K +ラインでかなり相当です。これは、C++/CLIを使って書かれています。これは、ラッパーを構築できるように設計された、C++と主に互換性のあるMicrosoftの開発言語です。それは非常にうまく動作します.Windowsのみであるという警告があります。モノはそれを取らない。私はあなたにどれだけの懸念があるか分かりませんが、おそらくCOMよりも優れた選択肢です。残念ながら、基本的に自分自身で考えなければならないヒントやトリックがたくさんあります。私はSlimDXで使っているものについてたくさんブログを書くつもりだったが、どういうわけか私は決してそれに慣れることはできない。

Java側では、JNIを使​​用する必要があります。それで幸運。私は、JNIと一緒に仕事をしている人に、二人とも笑っていない人と話をしたことはありません。

1

SWIGを使用してJNIの情報を処理すると、cpp APIをラップし、Javaから非常に無痛で使用できます。

は、ここで私はCで実装されているソフトウェアを維持++が、Javaや.NETなどの、だけでなく、デルファイとVB6を含む複数の言語でのインターフェイスを持っている必要がありますSWIG tutorial

0

です。さらに、複数のプラットフォームで動作する必要があります(JavaはUNIX上で動作する必要があります)。

基本的な型を使用してプレーンC関数をエクスポートする単一のDLLを使用する方法でした。たとえば、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のコードは、言語固有のクラスラッパーを実装していますが、これらのCのDLL関数を呼び出します。各クラスラッパーはハンドルを含み、それをC関数に渡します。

これは、ほとんどの言語がCを最も低い共通分母として使用する傾向があるため、非常にうまくいきます。薄いC APIを通じてインターフェイスをエクスポートできるのであれば、他の言語のインターフェイスを構築できます。

関数シグネチャはプラットフォーム間ではるかに標準化されているため、C言語ではなくC++ APIをエクスポートします。

C#とJavaでは、マルチバイト文字列エンコーディングを処理する必要があるので、文字列をC++コードに変換する方法を理解する必要があります。これは、通常、ロケールについての知識を必要とするか、安価でUTF-8をサポートするだけです。

関連する問題