summaryrefslogtreecommitdiffstats
path: root/service/jni/jni_helper.h
diff options
context:
space:
mode:
Diffstat (limited to 'service/jni/jni_helper.h')
-rw-r--r--service/jni/jni_helper.h183
1 files changed, 154 insertions, 29 deletions
diff --git a/service/jni/jni_helper.h b/service/jni/jni_helper.h
index 5393efec0..834b0ac5f 100644
--- a/service/jni/jni_helper.h
+++ b/service/jni/jni_helper.h
@@ -3,33 +3,158 @@ namespace android {
/* JNI Helpers for wifi_hal to WifiNative bridge implementation */
-void throwException( JNIEnv *env, const char *message, int line );
-jboolean getBoolField(JNIEnv *env, jobject obj, const char *name);
-jint getIntField(JNIEnv *env, jobject obj, const char *name);
-jlong getLongField(JNIEnv *env, jobject obj, const char *name);
-jobject getObjectField(JNIEnv *env, jobject obj, const char *name, const char *type);
-jlong getLongArrayField(JNIEnv *env, jobject obj, const char *name, int index);
-jobject getObjectArrayField(JNIEnv *env, jobject obj, const char *name, const char *type, int index);
-void setIntField(JNIEnv *env, jobject obj, const char *name, jint value);
- void setByteField(JNIEnv *env, jobject obj, const char *name, jbyte value);
- jbyte getByteField(JNIEnv *env, jobject obj, const char *name);
-void setBooleanField(JNIEnv *env, jobject obj, const char *name, jboolean value);
-void setLongField(JNIEnv *env, jobject obj, const char *name, jlong value);
-void setLongArrayField(JNIEnv *env, jobject obj, const char *name, jlongArray value);
-void setLongArrayElement(JNIEnv *env, jobject obj, const char *name, int index, jlong value);
-jboolean setStringField(JNIEnv *env, jobject obj, const char *name, const char *value);
-void reportEvent(JNIEnv *env, jclass cls, const char *method, const char *signature, ...);
-jobject createObject(JNIEnv *env, const char *className);
-jobjectArray createObjectArray(JNIEnv *env, const char *className, int size);
-void setObjectField(JNIEnv *env, jobject obj, const char *name, const char *type, jobject value);
-
-jlong getStaticLongField(JNIEnv *env, jobject obj, const char *name);
-jlong getStaticLongField(JNIEnv *env, jclass cls, const char *name);
-void setStaticLongField(JNIEnv *env, jobject obj, const char *name, jlong value);
-void setStaticLongField(JNIEnv *env, jclass cls, const char *name, jlong value);
-jlong getStaticLongArrayField(JNIEnv *env, jobject obj, const char *name, int index);
-jlong getStaticLongArrayField(JNIEnv *env, jclass cls, const char *name, int index);
-void setStaticLongArrayField(JNIEnv *env, jobject obj, const char *name, jlongArray value);
-void setStaticLongArrayField(JNIEnv *env, jclass obj, const char *name, jlongArray value);
+class JNIHelper;
+
+template<typename T>
+class JNIObject {
+protected:
+ JNIHelper &mHelper;
+ T mObj;
+public:
+ JNIObject(JNIHelper &helper, T obj);
+ JNIObject(const JNIObject<T>& 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<T>& operator = (const JNIObject<T>& rhs) {
+ release();
+ mHelper = rhs.mHelper;
+ mObj = rhs.mObj;
+ return *this;
+ }
+ void print() {
+ ALOGD("holding %p", mObj);
+ }
+
+private:
+ template<typename T2>
+ JNIObject(const JNIObject<T2>& 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<jstring> getStringField(jobject obj, const char *name);
+ bool getStringFieldValue(jobject obj, const char *name, char *buf, int size);
+ JNIObject<jobject> getObjectField(jobject obj, const char *name, const char *type);
+ JNIObject<jobjectArray> getArrayField(jobject obj, const char *name, const char *type);
+ jlong getLongArrayField(jobject obj, const char *name, int index);
+ JNIObject<jobject> 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<jobject> createObject(const char *className);
+ JNIObject<jobjectArray> 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<jobject> getObjectArrayElement(jobjectArray array, int index);
+ JNIObject<jobject> getObjectArrayElement(jobject array, int index);
+ int getArrayLength(jarray array);
+ JNIObject<jobjectArray> newObjectArray(int num, const char *className, jobject val);
+ JNIObject<jbyteArray> newByteArray(int num);
+ JNIObject<jintArray> newIntArray(int num);
+ JNIObject<jlongArray> newLongArray(int num);
+ JNIObject<jstring> 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<jobject>;
+ friend class JNIObject<jstring>;
+ friend class JNIObject<jobjectArray>;
+ friend class JNIObject<jclass>;
+ friend class JNIObject<jlongArray>;
+ friend class JNIObject<jbyteArray>;
+ friend class JNIObject<jintArray>;
+ jobject newLocalRef(jobject obj);
+ void deleteLocalRef(jobject obj);
+};
+
+template<typename T>
+JNIObject<T>::JNIObject(JNIHelper &helper, T obj)
+ : mHelper(helper), mObj(obj)
+{ }
+
+template<typename T>
+JNIObject<T>::JNIObject(const JNIObject<T>& rhs)
+ : mHelper(rhs.mHelper), mObj(NULL)
+{
+ mObj = (T)mHelper.newLocalRef(rhs.mObj);
+}
+
+template<typename T>
+JNIObject<T>::~JNIObject() {
+ release();
+}
+
+template<typename T>
+void JNIObject<T>::release()
+{
+ if (mObj != NULL) {
+ mHelper.deleteLocalRef(mObj);
+ mObj = NULL;
+ }
}
-#define THROW(env, message) throwException(env, message, __LINE__)
+
+template<typename T>
+T JNIObject<T>::clone()
+{
+ return mHelper.newLocalRef(mObj);
+}
+
+}
+
+#define THROW(env, message) (env).throwException(message, __LINE__)