2016-10-23 10 views
0

私はC++ライブラリ(bullet physics)を組み込んだ素早いプロジェクトに取り組んでいます。現在、Objective-CでC++ライブラリをラップし、SwiftのObjective-Cコードをブリッジヘッダー経由で使用してこれを実現しています。C++オブジェクトへの参照ポインタを迅速に?

私はObjective-Cラッパーを排除し、コードをプラットフォームに依存しないようにするために、純粋なCインターフェイス経由でBulletにアクセスしたいと考えています。

概念的には、extern "C"を使用してC++コード用のCインターフェイスを作成する方法を理解していますが、Swift Codeで使用可能なC++ライブラリの型を作成する方法がわかりません。

// BulletCInterface.h 

#ifdef __cplusplus 
extern "C" { 
#endif 

btRigidBody* createRigidBody(); 

#ifdef __cplusplus 
} 
#endif 

そして、C++実装ファイル:

//BulletCInterface.cpp 

#import <BulletDynamics/btBulletCollisionCommon.h> 
#import <BulletDynamics/btBulletDynamicsCommon.h> 

#ifdef __cplusplus 
extern "C" { 
#endif 

btRigidBody* createRigidBody() { 
    //invoke the C++ bullet API to produce a btRigid body 
    //... 
} 

#ifdef __cplusplus 
} 
#endif 
Cヘッダファイルで

// MyPhysicsObject.swift 

class MyPhysicsObject { 

    let rigidBody: btRigidBody 

    init() { 
     self.rigidBody = createRigidBody() //called from C interface 
    } 

} 

たとえば、私はこのような何かをできるようにしたいと思います

しかし、これを試みると、コンパイラはのbtRigidBodyが未定義の型であると不平を言う。最低限、これらのオブジェクトへの参照を迅速に保持できるようにしたいと考えています。最高でデータメンバ(大量など)にアクセスできるようにしたいと思います。

これらのC++型を私のスウィフトコード?または、私はすべてをvoid*にして、自分自身のタイプを記録しなければならないのですか?

答えて

1

Swiftのドキュメント「SwiftにC++コードを直接インポートすることはできませんが、C++コード用のObjective-CまたはCラッパーを作成することはできません。 https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/を参照してください。

Objective-Cを画像から外しておきたい場合は、実行しようとしているCラッパーが必要です。 Swiftから呼び出し可能なCインタフェースにC++型をラップする必要があります。 btRigidBodyについてのエラーは、タイプがラップされていないためです。私はそれがC++型であると仮定しており、その定義はCのインタフェースヘッダでは利用できません。そのタイプをBulletCInterface.hに定義するヘッダーを含めると、ブリッジヘッダー経由でSwiftで使用できないため、機能しません。

ラッパーのCインターフェイスには、使用するC++クラスのメソッドとデータメンバーにマップする関数を含めることができます。

ところで、あなたはちょうどあなたがプリプロセッサの条件文なしextern "C"を使用できるように、それは、すべてのC++のコードです

// This should return a C wrapper for the btRigidBody C++ type 
extern "C" btRigidBodyWrapper* createRigidBody() { 
    ... 
} 

を行い、BulletCInterface.cpp#ifdef __cplusplusを必要としません。

うまくいけば、これは役に立ちます。

関連する問題