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