17f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 27f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndenamespace android { 37f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 47f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde/* JNI Helpers for wifi_hal to WifiNative bridge implementation */ 57f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 67d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandeclass JNIHelper; 77d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 87d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T> 97d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandeclass JNIObject { 107d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandeprotected: 117d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper &mHelper; 127d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande T mObj; 137d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandepublic: 147d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject(JNIHelper &helper, T obj); 157d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject(const JNIObject<T>& rhs); 167d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande virtual ~JNIObject(); 177d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper& getHelper() const { 187d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return mHelper; 197d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande } 207d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande T get() const { 217d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return mObj; 227d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande } 237d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande operator T() const { 247d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return mObj; 257d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande } 267d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande bool isNull() const { 277d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return mObj == NULL; 287d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande } 297d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void release(); 307d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande T detach() { 317d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande T tObj = mObj; 327d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande mObj = NULL; 337d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return tObj; 347d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande } 357d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande T clone(); 367d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<T>& operator = (const JNIObject<T>& rhs) { 377d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande release(); 387d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande mHelper = rhs.mHelper; 397d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande mObj = rhs.mObj; 407d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return *this; 417d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande } 427d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void print() { 437d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ALOGD("holding %p", mObj); 447d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande } 457d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 467d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandeprivate: 477d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande template<typename T2> 487d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject(const JNIObject<T2>& rhs); 497d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}; 507d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 517d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandeclass JNIHelper { 527d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JavaVM *mVM; 537d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIEnv *mEnv; 547d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 557d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandepublic : 567d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper(JavaVM *vm); 577d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper(JNIEnv *env); 587d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ~JNIHelper(); 597d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 607d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void throwException(const char *message, int line); 617d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 627d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande /* helpers to deal with members */ 637d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jboolean getBoolField(jobject obj, const char *name); 647d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jint getIntField(jobject obj, const char *name); 657d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jlong getLongField(jobject obj, const char *name); 667d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jstring> getStringField(jobject obj, const char *name); 677d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande bool getStringFieldValue(jobject obj, const char *name, char *buf, int size); 687d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> getObjectField(jobject obj, const char *name, const char *type); 697d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobjectArray> getArrayField(jobject obj, const char *name, const char *type); 707d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jlong getLongArrayField(jobject obj, const char *name, int index); 717d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> getObjectArrayField( 727d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jobject obj, const char *name, const char *type, int index); 737d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setIntField(jobject obj, const char *name, jint value); 747d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setByteField(jobject obj, const char *name, jbyte value); 757d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jbyte getByteField(jobject obj, const char *name); 767d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setBooleanField(jobject obj, const char *name, jboolean value); 777d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setLongField(jobject obj, const char *name, jlong value); 787d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setLongArrayField(jobject obj, const char *name, jlongArray value); 797d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setLongArrayElement(jobject obj, const char *name, int index, jlong value); 807d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jboolean setStringField(jobject obj, const char *name, const char *value); 817d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void reportEvent(jclass cls, const char *method, const char *signature, ...); 827d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> createObject(const char *className); 837d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobjectArray> createObjectArray(const char *className, int size); 847d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setObjectField(jobject obj, const char *name, const char *type, jobject value); 857d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 867d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande /* helpers to deal with static members */ 877d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jlong getStaticLongField(jobject obj, const char *name); 887d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jlong getStaticLongField(jclass cls, const char *name); 897d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setStaticLongField(jobject obj, const char *name, jlong value); 907d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setStaticLongField(jclass cls, const char *name, jlong value); 917d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jlong getStaticLongArrayField(jobject obj, const char *name, int index); 927d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jlong getStaticLongArrayField(jclass cls, const char *name, int index); 937d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setStaticLongArrayField(jobject obj, const char *name, jlongArray value); 947d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setStaticLongArrayField(jclass obj, const char *name, jlongArray value); 957d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jboolean callStaticMethod(jclass cls, const char *method, const char *signature, ...); 967d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 977d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> getObjectArrayElement(jobjectArray array, int index); 987d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> getObjectArrayElement(jobject array, int index); 997d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande int getArrayLength(jarray array); 1007d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobjectArray> newObjectArray(int num, const char *className, jobject val); 1017d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jbyteArray> newByteArray(int num); 1027d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jintArray> newIntArray(int num); 1037d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jlongArray> newLongArray(int num); 1047d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jstring> newStringUTF(const char *utf); 1057d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setObjectArrayElement(jobjectArray array, int index, jobject obj); 1067d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setByteArrayRegion(jbyteArray array, int from, int to, jbyte *bytes); 1077d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setIntArrayRegion(jintArray array, int from, int to, jint *ints); 1087d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setLongArrayRegion(jlongArray array, int from, int to, jlong *longs); 1097d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1107d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jobject newGlobalRef(jobject obj); 1117d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void deleteGlobalRef(jobject obj); 1127d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1137d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandeprivate: 1147d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande /* Jni wrappers */ 1157d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande friend class JNIObject<jobject>; 1167d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande friend class JNIObject<jstring>; 1177d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande friend class JNIObject<jobjectArray>; 1187d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande friend class JNIObject<jclass>; 1197d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande friend class JNIObject<jlongArray>; 1207d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande friend class JNIObject<jbyteArray>; 1217d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande friend class JNIObject<jintArray>; 1227d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jobject newLocalRef(jobject obj); 1237d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void deleteLocalRef(jobject obj); 1247d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}; 1257d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1267d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T> 1277d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<T>::JNIObject(JNIHelper &helper, T obj) 1287d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande : mHelper(helper), mObj(obj) 1297d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{ } 1307d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1317d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T> 1327d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<T>::JNIObject(const JNIObject<T>& rhs) 1337d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande : mHelper(rhs.mHelper), mObj(NULL) 1347d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{ 1357d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande mObj = (T)mHelper.newLocalRef(rhs.mObj); 1367d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande} 1377d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1387d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T> 1397d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<T>::~JNIObject() { 1407d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande release(); 1417d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande} 1427d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1437d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T> 1447d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIObject<T>::release() 1457d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{ 1467d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande if (mObj != NULL) { 1477d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande mHelper.deleteLocalRef(mObj); 1487d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande mObj = NULL; 1497d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande } 1507f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 1517d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1527d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T> 1537d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeT JNIObject<T>::clone() 1547d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{ 1557d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return mHelper.newLocalRef(mObj); 1567d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande} 1577d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1587d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande} 1597d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1607d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande#define THROW(env, message) (env).throwException(message, __LINE__) 161