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