के पर विचार हम एक सी ++ वर्ग करते हैं:
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
};
हम जावा में एक वर्ग Bot
बनाना चाहते हैं कि इस अर्थ में कि super
करने के लिए कॉल iVehicle::GetSize()
से सी ++ कोड आह्वान और सी से, में वर्ग iVehicle
फैली ++ दृष्टिकोण, हम Bot
के उदाहरणों को iVehicle*
चर के रूप में उपयोग कर सकते हैं। यह कठिन है क्योंकि सी ++ प्रतिबिंब के लिए कोई अच्छी अंतर्निहित कार्यक्षमता प्रदान नहीं करता है।
यहां एक संभावित समाधान है।
जावा में सी ++ वर्ग का उपयोग करने के लिए हम, एक जावा आवरण उत्पन्न करने के लिए की जरूरत है अर्थात्:
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();
}
जावा में उपयोग सरल है:
class Bot extends iVehicle
{
public int GetSize()
{
if (condition) return 0;
// call C++ code
return super.GetSize();
}
}
हालांकि, वहाँ एक सी ++ हिस्सा है यह कोड:
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()
के लिए है।
फिर जावा के Bot
का एक उदाहरण बनाना आपको CreateNativeObject()
पर कॉल करना होगा और लौटा मान NativeObjectHolder
फ़ील्ड पर असाइन करना होगा।
JNIEXPORT int JNICALL Java_com_test_iVehicle_CreateNativeObject(JNIEnv* env, jobject thiz)
{
iVehicle* Obj = new iVehicle;
return (int)Obj;
}
तो, यह योजना है। इस काम को करने के लिए आपको विनाश कोड जोड़ने और इस गोंद कोड को उत्पन्न करने के लिए सी ++ कक्षाओं को पार्स करने की आवश्यकता होगी।
जोड़ा गया:
मामले में जहां iVehicle
वास्तव में सार आप एक गैर सार आवरण है कि आप का दृष्टांत करने में सक्षम हैं उत्पन्न करने के लिए होगा:
class iVehicle
{
virtual void Run() = 0;
}
class iVehicle_Wrapper: public iVehicle
{
virtual void Run() { ERROR("Abstract method called"); };
}
और CreateNativeObject()
में iVehicle_Wrapper
का दृष्टांत। Vuala! आपने जावा में एक सार सी ++ कक्षा विरासत में ली है।
प्रारंभ [यहां] (http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/intro.html#wp725)। आप पाएंगे कि जेएनआई गोंद जावा को सी ++ कक्षाओं से बंधे नहीं है। इसके लिए, आपको जेएनआई के आसपास बनाया गया कुछ चाहिए।[जेस] (http://code.google.com/p/jace/wiki/Overview) उपयोगी है लेकिन जहां तक आप वर्णन करते हैं उतना नहीं जाता है। मेरी शर्त यह है कि आपको कुछ भी नहीं मिलेगा जो आपको मैन्युअल रूप से एक ठोस सी ++ वर्ग बनाने और उसे लपेटने से बचाता है। –
@ टॉमब्लोडेट: धन्यवाद! रैपर बनाने के लिए, क्या आप SWIG जैसे कुछ टूल का सुझाव देते हैं या ऐसा करने का कोई और तरीका है? – vvid
भी [ब्रिजजे] (http://bridj.googlecode.com) पर एक नज़र डालें। –