00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef __ccxx_JavaContext_hxx
00024 #define __ccxx_JavaContext_hxx
00025
00026 #include <commonc++/Common.h++>
00027 #include <commonc++/Exception.h++>
00028 #include <commonc++/String.h++>
00029 #include <commonc++/JavaException.h++>
00030
00031 #include <jni.h>
00032 #include <cstdarg>
00033
00034 namespace ccxx {
00035
00036 class JavaVirtualMachine;
00037
00043 struct JavaNativeMethod
00044 {
00046 String signature;
00047
00049 void *function;
00050 };
00051
00069 class COMMONCPPJVM_API JavaContext
00070 {
00071 friend class JavaVirtualMachine;
00072
00073 public:
00074
00079 JavaContext(JNIEnv *env);
00080
00082 ~JavaContext();
00083
00090 static String encodeType(const String &type);
00091
00107 static bool parseSignature(const String &signature, String& method,
00108 String& descriptor, bool &isStatic);
00109
00118 jclass findClass(const String &name) throw(JavaException);
00119
00131 jmethodID findMethod(jclass clazz, const String &signature)
00132 throw(JavaException);
00133
00141 jobject createObject(jclass clazz, jmethodID constructor, ...)
00142 throw(JavaException);
00143
00152 jobject createObjectVA(jclass clazz, jmethodID constructor, va_list args)
00153 throw(JavaException);
00154
00162 void callVoidMethod(jobject object, jmethodID method, ...)
00163 throw(JavaException);
00164
00173 jobject callObjectMethod(jobject object, jmethodID method, ...)
00174 throw(JavaException);
00175
00184 String callStringMethod(jobject object, jmethodID method, ...)
00185 throw(JavaException);
00186
00195 WString callWStringMethod(jobject object, jmethodID method, ...)
00196 throw(JavaException);
00197
00206 bool callBooleanMethod(jobject object, jmethodID method, ...)
00207 throw(JavaException);
00208
00217 byte_t callByteMethod(jobject object, jmethodID method, ...)
00218 throw(JavaException);
00219
00228 char16_t callCharMethod(jobject object, jmethodID method, ...)
00229 throw(JavaException);
00230
00239 int16_t callShortMethod(jobject object, jmethodID method, ...)
00240 throw(JavaException);
00241
00250 int32_t callIntMethod(jobject object, jmethodID method, ...)
00251 throw(JavaException);
00252
00261 int64_t callLongMethod(jobject object, jmethodID method, ...)
00262 throw(JavaException);
00263
00272 float callFloatMethod(jobject object, jmethodID method, ...)
00273 throw(JavaException);
00274
00283 double callDoubleMethod(jobject object, jmethodID method, ...)
00284 throw(JavaException);
00285
00294 void callNonvirtualVoidMethod(jobject object, jclass clazz,
00295 jmethodID method, ...)
00296 throw(JavaException);
00297
00307 jobject callNonvirtualObjectMethod(jobject object, jclass clazz,
00308 jmethodID method, ...)
00309 throw(JavaException);
00310
00320 bool callNonvirtualBooleanMethod(jobject object, jclass clazz,
00321 jmethodID method, ...)
00322 throw(JavaException);
00323
00333 byte_t callNonvirtualByteMethod(jobject object, jclass clazz,
00334 jmethodID method, ...)
00335 throw(JavaException);
00336
00346 char16_t callNonvirtualCharMethod(jobject object, jclass clazz,
00347 jmethodID method, ...)
00348 throw(JavaException);
00349
00359 int16_t callNonvirtualShortMethod(jobject object, jclass clazz,
00360 jmethodID method, ...)
00361 throw(JavaException);
00362
00372 int32_t callNonvirtualIntMethod(jobject object, jclass clazz,
00373 jmethodID method, ...)
00374 throw(JavaException);
00375
00385 int64_t callNonvirtualLongMethod(jobject object, jclass clazz,
00386 jmethodID method, ...)
00387 throw(JavaException);
00388
00398 float callNonvirtualFloatMethod(jobject object, jclass clazz,
00399 jmethodID method, ...)
00400 throw(JavaException);
00401
00411 double callNonvirtualDoubleMethod(jobject object, jclass clazz,
00412 jmethodID method, ...)
00413 throw(JavaException);
00414
00423 void callStaticVoidMethod(jclass clazz, jmethodID method, ...)
00424 throw(JavaException);
00425
00434 jobject callStaticObjectMethod(jclass clazz, jmethodID method, ...)
00435 throw(JavaException);
00436
00445 String callStaticStringMethod(jclass clazz, jmethodID method, ...)
00446 throw(JavaException);
00447
00456 WString callStaticWStringMethod(jclass clazz, jmethodID method, ...)
00457 throw(JavaException);
00458
00467 bool callStaticBooleanMethod(jclass clazz, jmethodID method, ...)
00468 throw(JavaException);
00469
00478 byte_t callStaticByteMethod(jclass clazz, jmethodID method, ...)
00479 throw(JavaException);
00480
00489 char16_t callStaticCharMethod(jclass clazz, jmethodID method, ...)
00490 throw(JavaException);
00491
00500 int16_t callStaticShortMethod(jclass clazz, jmethodID method, ...)
00501 throw(JavaException);
00502
00511 int32_t callStaticIntMethod(jclass clazz, jmethodID method, ...)
00512 throw(JavaException);
00513
00522 int64_t callStaticLongMethod(jclass clazz, jmethodID method, ...)
00523 throw(JavaException);
00524
00533 float callStaticFloatMethod(jclass clazz, jmethodID method, ...)
00534 throw(JavaException);
00535
00544 double callStaticDoubleMethod(jclass clazz, jmethodID method, ...)
00545 throw(JavaException);
00546
00554 bool checkException(bool verbose = false);
00555
00559 void clearException() throw();
00560
00566 jthrowable getException() throw();
00567
00574 bool throwException(jclass exception, const String &message);
00575
00585 jfieldID findField(jclass clazz, const String &signature)
00586 throw(JavaException);
00587
00595 jobject getObjectField(jobject object, jfieldID field) throw(JavaException);
00596
00604 bool getBooleanField(jobject object, jfieldID field) throw(JavaException);
00605
00613 byte_t getByteField(jobject object, jfieldID field) throw(JavaException);
00614
00622 char16_t getCharField(jobject object, jfieldID field) throw(JavaException);
00623
00631 int16_t getShortField(jobject object, jfieldID field) throw(JavaException);
00632
00640 int32_t getIntField(jobject object, jfieldID field) throw(JavaException);
00641
00649 int64_t getLongField(jobject object, jfieldID field) throw(JavaException);
00650
00658 float getFloatField(jobject object, jfieldID field) throw(JavaException);
00659
00667 double getDoubleField(jobject object, jfieldID field) throw(JavaException);
00668
00676 String getStringField(jobject object, jfieldID field) throw(JavaException);
00677
00685 WString getWStringField(jobject object, jfieldID field) throw(JavaException);
00686
00694 jobject getStaticObjectField(jclass clazz, jfieldID field)
00695 throw(JavaException);
00696
00704 bool getStaticBooleanField(jclass clazz, jfieldID field)
00705 throw(JavaException);
00706
00714 byte_t getStaticByteField(jclass clazz, jfieldID field) throw(JavaException);
00715
00723 char16_t getStaticCharField(jclass clazz, jfieldID field)
00724 throw(JavaException);
00725
00733 int16_t getStaticShortField(jclass clazz, jfieldID field)
00734 throw(JavaException);
00735
00743 int32_t getStaticIntField(jclass clazz, jfieldID field) throw(JavaException);
00744
00752 int64_t getStaticLongField(jclass clazz, jfieldID field)
00753 throw(JavaException);
00754
00762 float getStaticFloatField(jclass clazz, jfieldID field)
00763 throw(JavaException);
00764
00772 double getStaticDoubleField(jclass clazz, jfieldID field)
00773 throw(JavaException);
00774
00782 String getStaticStringField(jclass clazz, jfieldID field)
00783 throw(JavaException);
00784
00792 WString getStaticWStringField(jclass clazz, jfieldID field)
00793 throw(JavaException);
00794
00802 void setObjectField(jobject object, jfieldID field, jobject value)
00803 throw(JavaException);
00804
00812 void setBooleanField(jobject object, jfieldID field, bool value)
00813 throw(JavaException);
00814
00822 void setByteField(jobject object, jfieldID field, byte_t value)
00823 throw(JavaException);
00824
00832 void setCharField(jobject object, jfieldID field, char16_t value)
00833 throw(JavaException);
00834
00842 void setShortField(jobject object, jfieldID field, int16_t value)
00843 throw(JavaException);
00844
00852 void setIntField(jobject object, jfieldID field, int32_t value)
00853 throw(JavaException);
00854
00862 void setLongField(jobject object, jfieldID field, int64_t value)
00863 throw(JavaException);
00864
00872 void setFloatField(jobject object, jfieldID field, float value)
00873 throw(JavaException);
00874
00882 void setDoubleField(jobject object, jfieldID field, double value)
00883 throw(JavaException);
00884
00892 void setStringField(jobject object, jfieldID field, const String &value)
00893 throw(JavaException);
00894
00902 void setWStringField(jobject object, jfieldID field, const WString &value)
00903 throw(JavaException);
00904
00912 void setStaticObjectField(jclass clazz, jfieldID field, jobject value)
00913 throw(JavaException);
00914
00922 void setStaticBooleanField(jclass clazz, jfieldID field, bool value)
00923 throw(JavaException);
00924
00932 void setStaticByteField(jclass clazz, jfieldID field, byte_t value)
00933 throw(JavaException);
00934
00942 void setStaticCharField(jclass clazz, jfieldID field, char16_t value)
00943 throw(JavaException);
00944
00952 void setStaticShortField(jclass clazz, jfieldID field, int16_t value)
00953 throw(JavaException);
00954
00962 void setStaticIntField(jclass clazz, jfieldID field, int32_t value)
00963 throw(JavaException);
00964
00972 void setStaticLongField(jclass clazz, jfieldID field, int64_t value)
00973 throw(JavaException);
00974
00982 void setStaticFloatField(jclass clazz, jfieldID field, float value)
00983 throw(JavaException);
00984
00992 void setStaticDoubleField(jclass clazz, jfieldID field, double value)
00993 throw(JavaException);
00994
01001 jbyteArray createByteArray(uint_t length)
01002 throw(JavaException);
01003
01011 void setObjectArrayElement(jobjectArray array, uint_t index, jobject value)
01012 throw(JavaException);
01013
01021 jobject getObjectArrayElement(jobjectArray array, uint_t index)
01022 throw(JavaException);
01023
01030 uint_t getArrayLength(jarray array) throw(JavaException);
01031
01040 jobject createDirectByteBuffer(byte_t *buf, size_t size)
01041 throw(JavaException);
01042
01052 void *getDirectBufferRegion(jobject buf, uint64_t &size);
01053
01060 jobject createLocalRef(jobject object) throw(JavaException);
01061
01066 void deleteLocalRef(jobject ref);
01067
01073 void ensureLocalCapacity(uint_t capacity) throw(JavaException);
01074
01081 jobject createGlobalRef(jobject object) throw(JavaException);
01082
01087 void deleteGlobalRef(jobject ref);
01088
01095 String decodeString(jstring str) throw(JavaException);
01096
01103 WString decodeWString(jstring str) throw(JavaException);
01104
01111 jstring encodeString(const String &str) throw(JavaException);
01112
01119 jstring encodeWString(const WString &str) throw(JavaException);
01120
01126 uint_t getStringLength(jstring str);
01127
01141 void *getArrayData(jarray array, uint_t &length, bool *isCopy = NULL)
01142 throw(JavaException);
01143
01150 void releaseArrayData(jarray array, void *data);
01151
01159 jbyteArray createByteArray(const byte_t *data, size_t length)
01160 throw(JavaException);
01161
01171 jarray createObjectArray(jclass type, uint_t length,
01172 jobject initialValue = NULL)
01173 throw(JavaException);
01174
01182 bool isSameObject(jobject object1, jobject object2);
01183
01192 bool isInstanceOf(jobject object, jclass clazz);
01193
01201 bool isAssignableFrom(jclass clazz1, jclass clazz2);
01202
01208 jclass getClassForObject(jobject object);
01209
01216 jclass getSuperclass(jclass clazz);
01217
01224 void enterMonitor(jobject object) throw(JavaException);
01225
01231 void exitMonitor(jobject object) throw(JavaException);
01232
01240 void registerNativeMethods(jclass clazz, const JavaNativeMethod methods[])
01241 throw(JavaException);
01242
01247 void unregisterNativeMethods(jclass clazz);
01248
01254 void pushLocalFrame(uint_t capacity = 8) throw(JavaException);
01255
01259 void popLocalFrame();
01260
01262 inline bool isVerbose() const throw()
01263 { return(_verbose); }
01264
01265 private:
01266
01267 void attach(JavaVirtualMachine *jvm, JNIEnv* env, bool verbose) throw();
01268 void detach() throw();
01269 inline bool isAttached() const throw()
01270 { return(_env != NULL); }
01271
01272 inline JNIEnv *getEnv() const throw()
01273 { return(_env); }
01274
01275 JavaVirtualMachine *_jvm;
01276 JNIEnv *_env;
01277 bool _verbose;
01278 };
01279
01280 };
01281
01282 #endif // __ccxx_JavaContext_hxx
01283
01284