jni_helper.h revision 956f54b391677d78379729dd14518edddf3c7660
1956f54b391677d78379729dd14518edddf3c7660Etan Cohen/*
2956f54b391677d78379729dd14518edddf3c7660Etan Cohen * Copyright 2016, The Android Open Source Project
3956f54b391677d78379729dd14518edddf3c7660Etan Cohen *
4956f54b391677d78379729dd14518edddf3c7660Etan Cohen * Licensed under the Apache License, Version 2.0 (the "License");
5956f54b391677d78379729dd14518edddf3c7660Etan Cohen * you may not use this file except in compliance with the License.
6956f54b391677d78379729dd14518edddf3c7660Etan Cohen * You may obtain a copy of the License at
7956f54b391677d78379729dd14518edddf3c7660Etan Cohen *
8956f54b391677d78379729dd14518edddf3c7660Etan Cohen *     http://www.apache.org/licenses/LICENSE-2.0
9956f54b391677d78379729dd14518edddf3c7660Etan Cohen *
10956f54b391677d78379729dd14518edddf3c7660Etan Cohen * Unless required by applicable law or agreed to in writing, software
11956f54b391677d78379729dd14518edddf3c7660Etan Cohen * distributed under the License is distributed on an "AS IS" BASIS,
12956f54b391677d78379729dd14518edddf3c7660Etan Cohen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13956f54b391677d78379729dd14518edddf3c7660Etan Cohen * See the License for the specific language governing permissions and
14956f54b391677d78379729dd14518edddf3c7660Etan Cohen * limitations under the License.
15956f54b391677d78379729dd14518edddf3c7660Etan Cohen */
167f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
177f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndenamespace android {
187f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
197f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde/* JNI Helpers for wifi_hal to WifiNative bridge implementation */
207f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
217d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandeclass JNIHelper;
227d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
237d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T>
247d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandeclass JNIObject {
257d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandeprotected:
267d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIHelper &mHelper;
277d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    T mObj;
287d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandepublic:
297d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject(JNIHelper &helper, T obj);
307d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject(const JNIObject<T>& rhs);
317d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    virtual ~JNIObject();
327d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIHelper& getHelper() const {
337d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        return mHelper;
347d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    }
357d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    T get() const {
367d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        return mObj;
377d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    }
387d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    operator T() const {
397d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        return mObj;
407d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    }
417d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    bool isNull() const {
427d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        return mObj == NULL;
437d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    }
447d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    void release();
457d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    T detach() {
467d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        T tObj = mObj;
477d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        mObj = NULL;
487d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        return tObj;
497d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    }
507d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    T clone();
517d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<T>& operator = (const JNIObject<T>& rhs) {
527d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        release();
537d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        mHelper = rhs.mHelper;
547d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        mObj = rhs.mObj;
557d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        return *this;
567d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    }
577d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    void print() {
587d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        ALOGD("holding %p", mObj);
597d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    }
607d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
617d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandeprivate:
627d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    template<typename T2>
637d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject(const JNIObject<T2>& rhs);
647d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande};
657d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
667d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandeclass JNIHelper {
677d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JavaVM *mVM;
687d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIEnv *mEnv;
697d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
707d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandepublic :
717d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIHelper(JavaVM *vm);
727d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIHelper(JNIEnv *env);
737d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    ~JNIHelper();
747d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
757d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    void throwException(const char *message, int line);
767d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
777d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    /* helpers to deal with members */
787d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jboolean getBoolField(jobject obj, const char *name);
797d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jint getIntField(jobject obj, const char *name);
807d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jlong getLongField(jobject obj, const char *name);
817d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jstring> getStringField(jobject obj, const char *name);
827d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    bool getStringFieldValue(jobject obj, const char *name, char *buf, int size);
837d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jobject> getObjectField(jobject obj, const char *name, const char *type);
847d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jobjectArray> getArrayField(jobject obj, const char *name, const char *type);
85956f54b391677d78379729dd14518edddf3c7660Etan Cohen    void getByteArrayField(jobject obj, const char *name, byte* buf, int size);
867d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jlong getLongArrayField(jobject obj, const char *name, int index);
877d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jobject> getObjectArrayField(
887d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande            jobject obj, const char *name, const char *type, int index);
897d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    void setIntField(jobject obj, const char *name, jint value);
907d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    void setByteField(jobject obj, const char *name, jbyte value);
917d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jbyte getByteField(jobject obj, const char *name);
927d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    void setBooleanField(jobject obj, const char *name, jboolean value);
937d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    void setLongField(jobject obj, const char *name, jlong value);
947d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    void setLongArrayField(jobject obj, const char *name, jlongArray value);
957d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    void setLongArrayElement(jobject obj, const char *name, int index, jlong value);
967d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jboolean setStringField(jobject obj, const char *name, const char *value);
977d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    void reportEvent(jclass cls, const char *method, const char *signature, ...);
987d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jobject> createObject(const char *className);
997d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jobjectArray> createObjectArray(const char *className, int size);
1007d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    void setObjectField(jobject obj, const char *name, const char *type, jobject value);
101956f54b391677d78379729dd14518edddf3c7660Etan Cohen    void callMethod(jobject obj, const char *method, const char *signature, ...);
1027d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
1037d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    /* helpers to deal with static members */
1047d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jlong getStaticLongField(jobject obj, const char *name);
1057d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jlong getStaticLongField(jclass cls, const char *name);
1067d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    void setStaticLongField(jobject obj, const char *name, jlong value);
1077d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    void setStaticLongField(jclass cls, const char *name, jlong value);
1087d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jlong getStaticLongArrayField(jobject obj, const char *name, int index);
1097d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jlong getStaticLongArrayField(jclass cls, const char *name, int index);
1107d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    void setStaticLongArrayField(jobject obj, const char *name, jlongArray value);
1117d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    void setStaticLongArrayField(jclass obj, const char *name, jlongArray value);
1127d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jboolean callStaticMethod(jclass cls, const char *method, const char *signature, ...);
1137d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
1147d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jobject> getObjectArrayElement(jobjectArray array, int index);
1157d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jobject> getObjectArrayElement(jobject array, int index);
1167d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    int getArrayLength(jarray array);
1177d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jobjectArray> newObjectArray(int num, const char *className, jobject val);
1187d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jbyteArray> newByteArray(int num);
1197d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jintArray> newIntArray(int num);
1207d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jlongArray> newLongArray(int num);
1217d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    JNIObject<jstring> newStringUTF(const char *utf);
1227d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    void setObjectArrayElement(jobjectArray array, int index, jobject obj);
1237d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    void setByteArrayRegion(jbyteArray array, int from, int to, jbyte *bytes);
1247d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    void setIntArrayRegion(jintArray array, int from, int to, jint *ints);
1257d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    void setLongArrayRegion(jlongArray array, int from, int to, jlong *longs);
1267d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
1277d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jobject newGlobalRef(jobject obj);
1287d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    void deleteGlobalRef(jobject obj);
1297d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
1307d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandeprivate:
1317d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    /* Jni wrappers */
1327d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    friend class JNIObject<jobject>;
1337d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    friend class JNIObject<jstring>;
1347d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    friend class JNIObject<jobjectArray>;
1357d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    friend class JNIObject<jclass>;
1367d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    friend class JNIObject<jlongArray>;
1377d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    friend class JNIObject<jbyteArray>;
1387d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    friend class JNIObject<jintArray>;
1397d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    jobject newLocalRef(jobject obj);
1407d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    void deleteLocalRef(jobject obj);
1417d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande};
1427d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
1437d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T>
1447d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<T>::JNIObject(JNIHelper &helper, T obj)
1457d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    : mHelper(helper), mObj(obj)
1467d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{ }
1477d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
1487d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T>
1497d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<T>::JNIObject(const JNIObject<T>& rhs)
1507d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    : mHelper(rhs.mHelper), mObj(NULL)
1517d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{
1527d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    mObj = (T)mHelper.newLocalRef(rhs.mObj);
1537d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
1547d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
1557d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T>
1567d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<T>::~JNIObject() {
1577d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    release();
1587d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
1597d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
1607d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T>
1617d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIObject<T>::release()
1627d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{
1637d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    if (mObj != NULL) {
1647d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        mHelper.deleteLocalRef(mObj);
1657d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande        mObj = NULL;
1667d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    }
1677f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde}
1687d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
1697d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T>
1707d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeT JNIObject<T>::clone()
1717d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{
1727d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande    return mHelper.newLocalRef(mObj);
1737d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
1747d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
1757d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}
1767d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande
1777d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande#define THROW(env, message)      (env).throwException(message, __LINE__)
178