java_class_wrapper.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. #ifndef JAVA_CLASS_WRAPPER_H
  2. #define JAVA_CLASS_WRAPPER_H
  3. #include "reference.h"
  4. #include <jni.h>
  5. #include <android/log.h>
  6. class JavaObject;
  7. class JavaClass : public Reference {
  8. OBJ_TYPE(JavaClass,Reference);
  9. enum ArgumentType {
  10. ARG_TYPE_VOID,
  11. ARG_TYPE_BOOLEAN,
  12. ARG_TYPE_BYTE,
  13. ARG_TYPE_CHAR,
  14. ARG_TYPE_SHORT,
  15. ARG_TYPE_INT,
  16. ARG_TYPE_LONG,
  17. ARG_TYPE_FLOAT,
  18. ARG_TYPE_DOUBLE,
  19. ARG_TYPE_STRING, //special case
  20. ARG_TYPE_CLASS,
  21. ARG_ARRAY_BIT=1<<16,
  22. ARG_NUMBER_CLASS_BIT=1<<17,
  23. ARG_TYPE_MASK=(1<<16)-1
  24. };
  25. Map<StringName,Variant> constant_map;
  26. struct MethodInfo {
  27. bool _static;
  28. Vector<uint32_t> param_types;
  29. Vector<StringName> param_sigs;
  30. uint32_t return_type;
  31. jmethodID method;
  32. };
  33. _FORCE_INLINE_ static void _convert_to_variant_type(int p_sig, Variant::Type& r_type, float& likelyhood) {
  34. likelyhood=1.0;
  35. r_type=Variant::NIL;
  36. switch(p_sig) {
  37. case ARG_TYPE_VOID: r_type=Variant::NIL; break;
  38. case ARG_TYPE_BOOLEAN|ARG_NUMBER_CLASS_BIT:
  39. case ARG_TYPE_BOOLEAN: r_type=Variant::BOOL; break;
  40. case ARG_TYPE_BYTE|ARG_NUMBER_CLASS_BIT:
  41. case ARG_TYPE_BYTE: r_type=Variant::INT; likelyhood=0.1; break;
  42. case ARG_TYPE_CHAR|ARG_NUMBER_CLASS_BIT:
  43. case ARG_TYPE_CHAR: r_type=Variant::INT; likelyhood=0.2; break;
  44. case ARG_TYPE_SHORT|ARG_NUMBER_CLASS_BIT:
  45. case ARG_TYPE_SHORT: r_type=Variant::INT; likelyhood=0.3; break;
  46. case ARG_TYPE_INT|ARG_NUMBER_CLASS_BIT:
  47. case ARG_TYPE_INT: r_type=Variant::INT; likelyhood=1.0; break;
  48. case ARG_TYPE_LONG|ARG_NUMBER_CLASS_BIT:
  49. case ARG_TYPE_LONG: r_type=Variant::INT; likelyhood=0.5; break;
  50. case ARG_TYPE_FLOAT|ARG_NUMBER_CLASS_BIT:
  51. case ARG_TYPE_FLOAT: r_type=Variant::REAL; likelyhood=1.0; break;
  52. case ARG_TYPE_DOUBLE|ARG_NUMBER_CLASS_BIT:
  53. case ARG_TYPE_DOUBLE: r_type=Variant::REAL; likelyhood=0.5; break;
  54. case ARG_TYPE_STRING: r_type=Variant::STRING; break;
  55. case ARG_TYPE_CLASS: r_type=Variant::OBJECT; break;
  56. case ARG_ARRAY_BIT|ARG_TYPE_VOID: r_type=Variant::NIL; break;
  57. case ARG_ARRAY_BIT|ARG_TYPE_BOOLEAN: r_type=Variant::ARRAY; break;
  58. case ARG_ARRAY_BIT|ARG_TYPE_BYTE: r_type=Variant::RAW_ARRAY; likelyhood=1.0; break;
  59. case ARG_ARRAY_BIT|ARG_TYPE_CHAR: r_type=Variant::RAW_ARRAY; likelyhood=0.5; break;
  60. case ARG_ARRAY_BIT|ARG_TYPE_SHORT: r_type=Variant::INT_ARRAY; likelyhood=0.3; break;
  61. case ARG_ARRAY_BIT|ARG_TYPE_INT: r_type=Variant::INT_ARRAY; likelyhood=1.0; break;
  62. case ARG_ARRAY_BIT|ARG_TYPE_LONG: r_type=Variant::INT_ARRAY; likelyhood=0.5; break;
  63. case ARG_ARRAY_BIT|ARG_TYPE_FLOAT: r_type=Variant::REAL_ARRAY; likelyhood=1.0; break;
  64. case ARG_ARRAY_BIT|ARG_TYPE_DOUBLE: r_type=Variant::REAL_ARRAY; likelyhood=0.5; break;
  65. case ARG_ARRAY_BIT|ARG_TYPE_STRING: r_type=Variant::STRING_ARRAY; break;
  66. case ARG_ARRAY_BIT|ARG_TYPE_CLASS: r_type=Variant::ARRAY; break;
  67. }
  68. }
  69. _FORCE_INLINE_ static bool _convert_object_to_variant(JNIEnv * env, jobject obj, Variant& var,uint32_t p_sig);
  70. bool _call_method(JavaObject* p_instance,const StringName& p_method,const Variant** p_args,int p_argcount,Variant::CallError &r_error,Variant& ret);
  71. friend class JavaClassWrapper;
  72. Map<StringName,List<MethodInfo> > methods;
  73. jclass _class;
  74. public:
  75. virtual Variant call(const StringName& p_method,const Variant** p_args,int p_argcount,Variant::CallError &r_error);
  76. JavaClass();
  77. };
  78. class JavaObject : public Reference {
  79. OBJ_TYPE(JavaObject,Reference);
  80. Ref<JavaClass> base_class;
  81. friend class JavaClass;
  82. jobject instance;
  83. public:
  84. virtual Variant call(const StringName& p_method,const Variant** p_args,int p_argcount,Variant::CallError &r_error);
  85. JavaObject(const Ref<JavaClass>& p_base,jobject *p_instance);
  86. ~JavaObject();
  87. };
  88. class JavaClassWrapper : public Object {
  89. OBJ_TYPE(JavaClassWrapper,Object);
  90. Map<String,Ref<JavaClass> > class_cache;
  91. friend class JavaClass;
  92. jclass activityClass;
  93. jmethodID findClass;
  94. jmethodID getDeclaredMethods;
  95. jmethodID getFields;
  96. jmethodID getParameterTypes;
  97. jmethodID getReturnType;
  98. jmethodID getModifiers;
  99. jmethodID getName;
  100. jmethodID Class_getName;
  101. jmethodID Field_getName;
  102. jmethodID Field_getModifiers;
  103. jmethodID Field_get;
  104. jmethodID Boolean_booleanValue;
  105. jmethodID Byte_byteValue;
  106. jmethodID Character_characterValue;
  107. jmethodID Short_shortValue;
  108. jmethodID Integer_integerValue;
  109. jmethodID Long_longValue;
  110. jmethodID Float_floatValue;
  111. jmethodID Double_doubleValue;
  112. jobject classLoader;
  113. bool _get_type_sig(JNIEnv *env, jobject obj, uint32_t& sig, String&strsig);
  114. static JavaClassWrapper *singleton;
  115. protected:
  116. static void _bind_methods();
  117. public:
  118. static JavaClassWrapper *get_singleton() { return singleton; }
  119. Ref<JavaClass> wrap(const String& p_class);
  120. JavaClassWrapper(jobject p_activity=NULL);
  121. };
  122. #endif // JAVA_CLASS_WRAPPER_H