1 2namespace android { 3 4/* JNI Helpers for wifi_hal to WifiNative bridge implementation */ 5 6class JNIHelper; 7 8template<typename T> 9class JNIObject { 10protected: 11 JNIHelper &mHelper; 12 T mObj; 13public: 14 JNIObject(JNIHelper &helper, T obj); 15 JNIObject(const JNIObject<T>& rhs); 16 virtual ~JNIObject(); 17 JNIHelper& getHelper() const { 18 return mHelper; 19 } 20 T get() const { 21 return mObj; 22 } 23 operator T() const { 24 return mObj; 25 } 26 bool isNull() const { 27 return mObj == NULL; 28 } 29 void release(); 30 T detach() { 31 T tObj = mObj; 32 mObj = NULL; 33 return tObj; 34 } 35 T clone(); 36 JNIObject<T>& operator = (const JNIObject<T>& rhs) { 37 release(); 38 mHelper = rhs.mHelper; 39 mObj = rhs.mObj; 40 return *this; 41 } 42 void print() { 43 ALOGD("holding %p", mObj); 44 } 45 46private: 47 template<typename T2> 48 JNIObject(const JNIObject<T2>& rhs); 49}; 50 51class JNIHelper { 52 JavaVM *mVM; 53 JNIEnv *mEnv; 54 55public : 56 JNIHelper(JavaVM *vm); 57 JNIHelper(JNIEnv *env); 58 ~JNIHelper(); 59 60 void throwException(const char *message, int line); 61 62 /* helpers to deal with members */ 63 jboolean getBoolField(jobject obj, const char *name); 64 jint getIntField(jobject obj, const char *name); 65 jlong getLongField(jobject obj, const char *name); 66 JNIObject<jstring> getStringField(jobject obj, const char *name); 67 bool getStringFieldValue(jobject obj, const char *name, char *buf, int size); 68 JNIObject<jobject> getObjectField(jobject obj, const char *name, const char *type); 69 JNIObject<jobjectArray> getArrayField(jobject obj, const char *name, const char *type); 70 jlong getLongArrayField(jobject obj, const char *name, int index); 71 JNIObject<jobject> getObjectArrayField( 72 jobject obj, const char *name, const char *type, int index); 73 void setIntField(jobject obj, const char *name, jint value); 74 void setByteField(jobject obj, const char *name, jbyte value); 75 jbyte getByteField(jobject obj, const char *name); 76 void setBooleanField(jobject obj, const char *name, jboolean value); 77 void setLongField(jobject obj, const char *name, jlong value); 78 void setLongArrayField(jobject obj, const char *name, jlongArray value); 79 void setLongArrayElement(jobject obj, const char *name, int index, jlong value); 80 jboolean setStringField(jobject obj, const char *name, const char *value); 81 void reportEvent(jclass cls, const char *method, const char *signature, ...); 82 JNIObject<jobject> createObject(const char *className); 83 JNIObject<jobjectArray> createObjectArray(const char *className, int size); 84 void setObjectField(jobject obj, const char *name, const char *type, jobject value); 85 86 /* helpers to deal with static members */ 87 jlong getStaticLongField(jobject obj, const char *name); 88 jlong getStaticLongField(jclass cls, const char *name); 89 void setStaticLongField(jobject obj, const char *name, jlong value); 90 void setStaticLongField(jclass cls, const char *name, jlong value); 91 jlong getStaticLongArrayField(jobject obj, const char *name, int index); 92 jlong getStaticLongArrayField(jclass cls, const char *name, int index); 93 void setStaticLongArrayField(jobject obj, const char *name, jlongArray value); 94 void setStaticLongArrayField(jclass obj, const char *name, jlongArray value); 95 jboolean callStaticMethod(jclass cls, const char *method, const char *signature, ...); 96 97 JNIObject<jobject> getObjectArrayElement(jobjectArray array, int index); 98 JNIObject<jobject> getObjectArrayElement(jobject array, int index); 99 int getArrayLength(jarray array); 100 JNIObject<jobjectArray> newObjectArray(int num, const char *className, jobject val); 101 JNIObject<jbyteArray> newByteArray(int num); 102 JNIObject<jintArray> newIntArray(int num); 103 JNIObject<jlongArray> newLongArray(int num); 104 JNIObject<jstring> newStringUTF(const char *utf); 105 void setObjectArrayElement(jobjectArray array, int index, jobject obj); 106 void setByteArrayRegion(jbyteArray array, int from, int to, jbyte *bytes); 107 void setIntArrayRegion(jintArray array, int from, int to, jint *ints); 108 void setLongArrayRegion(jlongArray array, int from, int to, jlong *longs); 109 110 jobject newGlobalRef(jobject obj); 111 void deleteGlobalRef(jobject obj); 112 113private: 114 /* Jni wrappers */ 115 friend class JNIObject<jobject>; 116 friend class JNIObject<jstring>; 117 friend class JNIObject<jobjectArray>; 118 friend class JNIObject<jclass>; 119 friend class JNIObject<jlongArray>; 120 friend class JNIObject<jbyteArray>; 121 friend class JNIObject<jintArray>; 122 jobject newLocalRef(jobject obj); 123 void deleteLocalRef(jobject obj); 124}; 125 126template<typename T> 127JNIObject<T>::JNIObject(JNIHelper &helper, T obj) 128 : mHelper(helper), mObj(obj) 129{ } 130 131template<typename T> 132JNIObject<T>::JNIObject(const JNIObject<T>& rhs) 133 : mHelper(rhs.mHelper), mObj(NULL) 134{ 135 mObj = (T)mHelper.newLocalRef(rhs.mObj); 136} 137 138template<typename T> 139JNIObject<T>::~JNIObject() { 140 release(); 141} 142 143template<typename T> 144void JNIObject<T>::release() 145{ 146 if (mObj != NULL) { 147 mHelper.deleteLocalRef(mObj); 148 mObj = NULL; 149 } 150} 151 152template<typename T> 153T JNIObject<T>::clone() 154{ 155 return mHelper.newLocalRef(mObj); 156} 157 158} 159 160#define THROW(env, message) (env).throwException(message, __LINE__) 161