のは、我々はC++クラスを持って考えてみましょう:
class iVehicle
{
public:
virtual void Run() {}; // not-pure virtual here for simplicity of a wrapper, but could be pure (see the end of the post)
virtual int GetSize() const; // we want to reuse it in Java
};
我々はsuper
への呼び出し意味でクラスiVehicle
を拡張するJavaにおけるクラスBot
を作成したいCから、iVehicle::GetSize()
からC++コードを呼び出し、++私たちは、Bot
のインスタンスをiVehicle*
という変数として使用することができます。 C++はリフレクションのための優れた組み込み機能を提供していないので難しいです。
ここに1つの解決策があります。
たちはすなわち、Javaラッパーを生成する必要がJavaでC++クラスを使用するには、次の
class iVehicle
{
public void Run() { Native_Run(); }
public int GetSize() { return Native_GetSize(); }
private native void Native_Run();
private native int Native_GetSize();
// typecasted to pointer in C++
private int NativeObjectHolder;
// create C++ object
native static private int CreateNativeObject();
}
Javaで使い方は簡単です:
class Bot extends iVehicle
{
public int GetSize()
{
if (condition) return 0;
// call C++ code
return super.GetSize();
}
}
しかし、C++の部分はにありこのコード:
static jfieldID gNativeObjectHolderFieldID;
JNIEXPORT void JNICALL Java_com_test_iVehicle_Run(JNIEnv* env, jobject thiz)
{
int Value = env->GetIntField(thiz, gNativeObjectHolderFieldID);
iVehicle* Obj = (iVehicle*)Obj;
// todo: add checks here, for NULL and for dynamic casting
Obj->Run();
}
同様のコードはGetSize()
です。
次に、JavaのBot
のインスタンスを作成するには、CreateNativeObject()
を呼び出して、NativeObjectHolder
フィールドに戻り値を割り当てる必要があります。
JNIEXPORT int JNICALL Java_com_test_iVehicle_CreateNativeObject(JNIEnv* env, jobject thiz)
{
iVehicle* Obj = new iVehicle;
return (int)Obj;
}
これはスキームです。この作業を行うには、破壊コードを追加し、C++クラスを解析してこのすべてのグルーコードを生成する必要があります。
を追加しました:
class iVehicle
{
virtual void Run() = 0;
}
class iVehicle_Wrapper: public iVehicle
{
virtual void Run() { ERROR("Abstract method called"); };
}
そしてCreateNativeObject()
でiVehicle_Wrapper
をインスタンス化:iVehicle
はあなたがインスタンス化することができます非抽象ラッパーを生成する必要があります実際に抽象的である場合には
。 Vuala! Javaで抽象的なC++クラスを継承しています。
[こちら](http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/intro.html#wp725)を開始してください。あなたは、JNI接着剤がJavaをC++クラスに束縛していないことがわかります。そのためには、JNIの周りに構築されたものが必要です。[Jace](http://code.google.com/p/jace/wiki/Overview)は便利ですが、あなたが描いた限りではありません。私は、あなたが手作業で具体的なC++クラスを作成してラップするのを避けるためのものは何も見つけられないと考えています。 –
@TomBlodget:ありがとう!ラッパーを作成するには、SWIGのようなツールをお勧めしますか、それを行うには他の方法がありますか? – vvid
[BridJ](http://bridj.googlecode.com)もご覧ください。 –