namespace android { /* JNI Helpers for wifi_hal to WifiNative bridge implementation */ class JNIHelper; template class JNIObject { protected: JNIHelper &mHelper; T mObj; public: JNIObject(JNIHelper &helper, T obj); JNIObject(const JNIObject& rhs); virtual ~JNIObject(); JNIHelper& getHelper() const { return mHelper; } T get() const { return mObj; } operator T() const { return mObj; } bool isNull() const { return mObj == NULL; } void release(); T detach() { T tObj = mObj; mObj = NULL; return tObj; } T clone(); JNIObject& operator = (const JNIObject& rhs) { release(); mHelper = rhs.mHelper; mObj = rhs.mObj; return *this; } void print() { ALOGD("holding %p", mObj); } private: template JNIObject(const JNIObject& rhs); }; class JNIHelper { JavaVM *mVM; JNIEnv *mEnv; public : JNIHelper(JavaVM *vm); JNIHelper(JNIEnv *env); ~JNIHelper(); void throwException(const char *message, int line); /* helpers to deal with members */ jboolean getBoolField(jobject obj, const char *name); jint getIntField(jobject obj, const char *name); jlong getLongField(jobject obj, const char *name); JNIObject getStringField(jobject obj, const char *name); bool getStringFieldValue(jobject obj, const char *name, char *buf, int size); JNIObject getObjectField(jobject obj, const char *name, const char *type); JNIObject getArrayField(jobject obj, const char *name, const char *type); jlong getLongArrayField(jobject obj, const char *name, int index); JNIObject getObjectArrayField( jobject obj, const char *name, const char *type, int index); void setIntField(jobject obj, const char *name, jint value); void setByteField(jobject obj, const char *name, jbyte value); jbyte getByteField(jobject obj, const char *name); void setBooleanField(jobject obj, const char *name, jboolean value); void setLongField(jobject obj, const char *name, jlong value); void setLongArrayField(jobject obj, const char *name, jlongArray value); void setLongArrayElement(jobject obj, const char *name, int index, jlong value); jboolean setStringField(jobject obj, const char *name, const char *value); void reportEvent(jclass cls, const char *method, const char *signature, ...); JNIObject createObject(const char *className); JNIObject createObjectArray(const char *className, int size); void setObjectField(jobject obj, const char *name, const char *type, jobject value); /* helpers to deal with static members */ jlong getStaticLongField(jobject obj, const char *name); jlong getStaticLongField(jclass cls, const char *name); void setStaticLongField(jobject obj, const char *name, jlong value); void setStaticLongField(jclass cls, const char *name, jlong value); jlong getStaticLongArrayField(jobject obj, const char *name, int index); jlong getStaticLongArrayField(jclass cls, const char *name, int index); void setStaticLongArrayField(jobject obj, const char *name, jlongArray value); void setStaticLongArrayField(jclass obj, const char *name, jlongArray value); jboolean callStaticMethod(jclass cls, const char *method, const char *signature, ...); JNIObject getObjectArrayElement(jobjectArray array, int index); JNIObject getObjectArrayElement(jobject array, int index); int getArrayLength(jarray array); JNIObject newObjectArray(int num, const char *className, jobject val); JNIObject newByteArray(int num); JNIObject newIntArray(int num); JNIObject newLongArray(int num); JNIObject newStringUTF(const char *utf); void setObjectArrayElement(jobjectArray array, int index, jobject obj); void setByteArrayRegion(jbyteArray array, int from, int to, jbyte *bytes); void setIntArrayRegion(jintArray array, int from, int to, jint *ints); void setLongArrayRegion(jlongArray array, int from, int to, jlong *longs); jobject newGlobalRef(jobject obj); void deleteGlobalRef(jobject obj); private: /* Jni wrappers */ friend class JNIObject; friend class JNIObject; friend class JNIObject; friend class JNIObject; friend class JNIObject; friend class JNIObject; friend class JNIObject; jobject newLocalRef(jobject obj); void deleteLocalRef(jobject obj); }; template JNIObject::JNIObject(JNIHelper &helper, T obj) : mHelper(helper), mObj(obj) { } template JNIObject::JNIObject(const JNIObject& rhs) : mHelper(rhs.mHelper), mObj(NULL) { mObj = (T)mHelper.newLocalRef(rhs.mObj); } template JNIObject::~JNIObject() { release(); } template void JNIObject::release() { if (mObj != NULL) { mHelper.deleteLocalRef(mObj); mObj = NULL; } } template T JNIObject::clone() { return mHelper.newLocalRef(mObj); } } #define THROW(env, message) (env).throwException(message, __LINE__)