1 /* 2 * CoolReader 3 Java Port helpers. 3 */ 4 5 #ifndef CR3_JAVA_H 6 #define CR3_JAVA_H 7 8 #include <jni.h> 9 #include <android/log.h> 10 11 #define LOG_TAG "cr3eng" 12 #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) 13 #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) 14 #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE,LOG_TAG,__VA_ARGS__) 15 #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__) 16 #define LOGASSERTFAILED(cond,...) __android_log_assert(cond,LOG_TAG,__VA_ARGS__) 17 18 #include "../../crengine/include/lvstring.h" 19 #include "../../crengine/include/lvdrawbuf.h" 20 #include "../../crengine/include/props.h" 21 #include "../../crengine/include/lvtinydom.h" 22 23 //==================================================================== 24 // libjnigraphics replacement for pre-2.2 SDKs 25 enum AndroidBitmapFormat { 26 ANDROID_BITMAP_FORMAT_NONE = 0, 27 ANDROID_BITMAP_FORMAT_RGBA_8888 = 1, 28 ANDROID_BITMAP_FORMAT_RGB_565 = 4, 29 ANDROID_BITMAP_FORMAT_RGBA_4444 = 7, 30 ANDROID_BITMAP_FORMAT_A_8 = 8, 31 }; 32 //==================================================================== 33 #define ANDROID_BITMAP_RESUT_SUCCESS 0 34 #define ANDROID_BITMAP_RESULT_BAD_PARAMETER -1 35 #define ANDROID_BITMAP_RESULT_JNI_EXCEPTION -2 36 #define ANDROID_BITMAP_RESULT_ALLOCATION_FAILED -3 37 38 typedef struct { 39 uint32_t width; 40 uint32_t height; 41 uint32_t stride; 42 int32_t format; 43 uint32_t flags; // 0 for now 44 } AndroidBitmapInfo; 45 46 47 class BitmapAccessorInterface { 48 public: 49 virtual LVDrawBuf * lock(JNIEnv* env, jobject jbitmap) = 0; 50 virtual void unlock(JNIEnv* env, jobject jbitmap, LVDrawBuf * buf ) = 0; 51 static BitmapAccessorInterface * getInstance(); ~BitmapAccessorInterface()52 virtual ~BitmapAccessorInterface() {} 53 }; 54 55 56 //==================================================================== 57 58 class CRJNIEnv { 59 public: 60 JNIEnv * env; 61 static uint8_t sdk_int; CRJNIEnv(JNIEnv * pEnv)62 CRJNIEnv(JNIEnv * pEnv) : env(pEnv) { } 63 JNIEnv * operator -> () { return env; } 64 lString32 fromJavaString( jstring str ); 65 jstring toJavaString( const lString32 & str ); 66 void fromJavaStringArray( jobjectArray array, lString32Collection & dst ); 67 jobjectArray toJavaStringArray( lString32Collection & dst ); 68 LVStreamRef jbyteArrayToStream( jbyteArray array ); 69 jbyteArray streamToJByteArray( LVStreamRef stream ); 70 jobject enumByNativeId( const char * classname, int id ); 71 CRPropRef fromJavaProperties( jobject jprops ); 72 jobject toJavaProperties( CRPropRef props ); 73 jobject toJavaTOCItem( LVTocItem * toc ); 74 }; 75 76 class CRClassAccessor : public CRJNIEnv { 77 protected: 78 jclass cls; 79 public: getClass()80 jclass getClass() { return cls; } CRClassAccessor(JNIEnv * pEnv,jclass _class)81 CRClassAccessor(JNIEnv * pEnv, jclass _class) : CRJNIEnv(pEnv) 82 { 83 cls = _class; 84 } CRClassAccessor(JNIEnv * pEnv,const char * className)85 CRClassAccessor(JNIEnv * pEnv, const char * className) : CRJNIEnv(pEnv) 86 { 87 cls = env->FindClass(className); 88 } 89 }; 90 91 class CRObjectAccessor : public CRClassAccessor { 92 jobject obj; 93 public: getObject()94 jobject getObject() { return obj; } CRObjectAccessor(JNIEnv * pEnv,jobject _obj)95 CRObjectAccessor(JNIEnv * pEnv, jobject _obj) 96 : CRClassAccessor(pEnv, pEnv->GetObjectClass(_obj)) 97 { 98 obj = _obj; 99 } 100 }; 101 102 class CRFieldAccessor { 103 protected: 104 CRObjectAccessor & objacc; 105 jfieldID fieldid; 106 public: CRFieldAccessor(CRObjectAccessor & acc,const char * fieldName,const char * fieldType)107 CRFieldAccessor( CRObjectAccessor & acc, const char * fieldName, const char * fieldType ) 108 : objacc(acc) 109 { 110 fieldid = objacc->GetFieldID( objacc.getClass(), fieldName, fieldType ); 111 } getObject()112 jobject getObject() 113 { 114 return objacc->GetObjectField(objacc.getObject(), fieldid); 115 } setObject(jobject obj)116 void setObject( jobject obj ) 117 { 118 return objacc->SetObjectField(objacc.getObject(), fieldid, obj); 119 } 120 }; 121 122 class CRMethodAccessor { 123 protected: 124 CRObjectAccessor & objacc; 125 jmethodID methodid; 126 public: CRMethodAccessor(CRObjectAccessor & acc,const char * methodName,const char * signature)127 CRMethodAccessor( CRObjectAccessor & acc, const char * methodName, const char * signature ) 128 : objacc(acc) 129 { 130 methodid = objacc->GetMethodID( objacc.getClass(), methodName, signature ); 131 } callObj()132 jobject callObj() 133 { 134 return objacc->CallObjectMethod( objacc.getObject(), methodid ); 135 } callObj(jobject obj)136 jobject callObj(jobject obj) 137 { 138 return objacc->CallObjectMethod( objacc.getObject(), methodid, obj ); 139 } callObj(jobject obj1,jobject obj2)140 jobject callObj(jobject obj1, jobject obj2) 141 { 142 return objacc->CallObjectMethod( objacc.getObject(), methodid, obj1, obj2 ); 143 } callBool()144 jboolean callBool() 145 { 146 return objacc->CallBooleanMethod( objacc.getObject(), methodid ); 147 } callInt()148 jint callInt() 149 { 150 return objacc->CallIntMethod( objacc.getObject(), methodid ); 151 } 152 }; 153 154 class CRStringField : public CRFieldAccessor { 155 public: CRStringField(CRObjectAccessor & acc,const char * fieldName)156 CRStringField( CRObjectAccessor & acc, const char * fieldName ) 157 : CRFieldAccessor( acc, fieldName, "Ljava/lang/String;" ) 158 { 159 } get()160 lString32 get() { 161 jstring str = (jstring)objacc->GetObjectField(objacc.getObject(), fieldid); 162 lString32 res = objacc.fromJavaString(str); 163 objacc.env->DeleteLocalRef(str); 164 return res; 165 } set(const lString32 & str)166 void set( const lString32& str) { objacc->SetObjectField(objacc.getObject(), fieldid, objacc.toJavaString(str)); } 167 }; 168 169 class CRIntField : public CRFieldAccessor { 170 public: CRIntField(CRObjectAccessor & acc,const char * fieldName)171 CRIntField( CRObjectAccessor & acc, const char * fieldName ) 172 : CRFieldAccessor( acc, fieldName, "I" ) 173 { 174 } get()175 int get() { return objacc->GetIntField(objacc.getObject(), fieldid); } set(int v)176 void set(int v) { objacc->SetIntField(objacc.getObject(), fieldid, v); } 177 }; 178 179 class CRLongField : public CRFieldAccessor { 180 public: CRLongField(CRObjectAccessor & acc,const char * fieldName)181 CRLongField( CRObjectAccessor & acc, const char * fieldName ) 182 : CRFieldAccessor( acc, fieldName, "J" ) 183 { 184 } get()185 lInt64 get() { return objacc->GetLongField(objacc.getObject(), fieldid); } set(lInt64 v)186 void set(lInt64 v) { objacc->SetLongField(objacc.getObject(), fieldid, v); } 187 }; 188 189 class BitmapAccessor : public CRJNIEnv { 190 private: 191 jobject bitmap; 192 int width; 193 int height; 194 int format; 195 int stride; 196 lUInt8 * pixels; 197 #ifndef USE_JNIGRAPHICS 198 jintArray array; 199 #endif 200 public: getWidth()201 int getWidth() { return width; } getHeight()202 int getHeight() { return height; } getFormat()203 int getFormat() { return format; } 204 void draw(LVDrawBuf * buf, int x, int y); 205 void setRowRGB( int x, int y, lUInt32 * rgb, int dx ); 206 void setRowGray( int x, int y, lUInt8 * gray, int dx, int bpp ); 207 bool isOk(); 208 BitmapAccessor( JNIEnv * pEnv, jobject bmp ); 209 ~BitmapAccessor(); 210 }; 211 212 #endif 213