%module "Java::Wrapper" %{ #include #include #include //#include //#include //using namespace std; %} %typemap(in) jstring { if ( SvPOK($input) ) { char *perl_str = SvPV($input, PL_na); $1 = JvNewStringLatin1(perl_str); } else { croak("Invalid input type, expecting string"); } } %typemap(out) jstring { EXTEND(sp, 1); $result = sv_newmortal(); jint len = JvGetStringUTFLength($1); if ( len == 0 ) { sv_setpv($result, ""); } else { char *buffer = new char[len + 1]; JvGetStringUTFRegion($1, 0, len, buffer); buffer[(int) len] = '\0'; sv_setpv($result, buffer); SvUTF8_on($result); delete buffer; } argvi++; } %typemap(in) jboolean { jboolean jbool = SvTRUE($input) ? true : false; $1 = jbool; } %typemap(out) jboolean { EXTEND(sp, 1); $result = $1 ? &PL_sv_yes : &PL_sv_no; argvi++; } %typemap(in) jint { int cpp_int = 0; if ( SvIOK($input) ) { cpp_int = SvIV($input); } else { croak("Cannot convert argument to type jint"); } jint real_val(cpp_int); $1 = real_val; } %typemap(out) jint { EXTEND(sp, 1); $result = newSViv((int) $1); argvi++; } %typemap(in) jshort { short int cpp_short = 0; if ( SvIOK($input) ) { cpp_short = SvIV($input); } else { croak("Cannot convert argument to type short"); } jshort real_val(cpp_short); $1 = real_val; } %typemap(in) jlong { long int cpp_long = 0; if ( SvIOK($input) ) { cpp_long = SvIV($input); } else { croak("Cannot convert argument to type long"); } jlong real_val(cpp_long); $1 = real_val; } %typemap(in) jfloat { float cpp_float = 0; if ( SvNOK($input) ) { cpp_float = SvNV($input); } else { croak("Cannot convert argument to type float"); } jfloat real_val(cpp_float); $1 = real_val; } %typemap(in) jdouble { double cpp_double = 0; if ( SvNOK($input) ) { cpp_double = SvNV($input); } else { croak("Cannot convert argument to type double"); } jdouble real_val(cpp_double); $1 = real_val; } %typemap(in) jbyte { jbyteArray myBytes = NULL; if ( SvPOK($input) ) { char *perl_str = SvPV($input, PL_na); jstring myStr = JvNewStringLatin1(perl_str); myBytes = myStr->getBytes(); } else { croak("Invalid input type, expecting string"); } jbyte *bytes = elements(myBytes); $1 = bytes[0]; } %typemap(in) jchar { jstring myStr = NULL; if ( SvPOK($input) ) { char *perl_str = SvPV($input, PL_na); myStr = JvNewStringLatin1(perl_str); } else { croak("Invalid input type, expecting string"); } $1 = myStr->charAt(0); } class ArgumentArray { public: ArgumentArray (jint); virtual void addElement (::ObjectWrapper *); virtual jint getSize (); }; class ObjectWrapper { public: ObjectWrapper (); virtual jboolean perl_isa (jstring); virtual jboolean can (jstring); virtual jstring toString (); virtual jboolean isArray (); virtual ::ObjectWrapper *invokeMethod (jstring, ::ArgumentArray *); virtual ::ObjectWrapper *getLastThrownException (); virtual ::ObjectWrapper *getField (jstring); virtual void setField (jstring, ::ObjectWrapper *); static ::ObjectWrapper *getLastStaticThrownException (); static ::ObjectWrapper *newClassInstance (jstring, ::ArgumentArray *); static ::ObjectWrapper *invokeStaticMethod (jstring, jstring, ::ArgumentArray *); static ::ArrayWrapper *newJavaArray (jstring, jint); static ::ObjectWrapper *wrapInt (jint); static ::ObjectWrapper *wrapString (jstring); static ::ObjectWrapper *wrapBoolean (jboolean); static ::ObjectWrapper *wrapShort (jshort); static ::ObjectWrapper *wrapLong (jlong); static ::ObjectWrapper *wrapFloat (jfloat); static ::ObjectWrapper *wrapDouble (jdouble); static ::ObjectWrapper *wrapByte (jbyte); static ::ObjectWrapper *wrapChar (jchar); }; class ArrayWrapper : public ::ObjectWrapper { public: ArrayWrapper (jstring, jint); virtual jint getSize (); virtual void set (::ObjectWrapper *, jint); virtual ::ObjectWrapper *get (jint); virtual jstring toString (); static ::ArrayWrapper *getObjectAsArray (::ObjectWrapper *); };