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