jni_helper.h revision 480554af1be404fe3920605e3c5634497995ff95
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> 63480554af1be404fe3920605e3c5634497995ff95Chih-Hung Hsieh JNIObject(const JNIObject<T2>& rhs); // NOLINT(implicit) 647d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}; 657d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 667d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandeclass JNIHelper { 677d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JavaVM *mVM; 687d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIEnv *mEnv; 697d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 707d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandepublic : 71480554af1be404fe3920605e3c5634497995ff95Chih-Hung Hsieh explicit JNIHelper(JavaVM *vm); 72480554af1be404fe3920605e3c5634497995ff95Chih-Hung Hsieh explicit 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); 8591a3f00bea170ed5a37566c12608b66755ddfa99Etan Cohen void getByteArrayField(jobject obj, const char *name, byte *buf, size_t size); 8691a3f00bea170ed5a37566c12608b66755ddfa99Etan Cohen void getByteArrayField(jobject obj, const char *name, byte *buf, size_t *size, int max_size); 877d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jlong getLongArrayField(jobject obj, const char *name, int index); 887d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> getObjectArrayField( 897d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jobject obj, const char *name, const char *type, int index); 907d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setIntField(jobject obj, const char *name, jint value); 917d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setByteField(jobject obj, const char *name, jbyte value); 927d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jbyte getByteField(jobject obj, const char *name); 937d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setBooleanField(jobject obj, const char *name, jboolean value); 947d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setLongField(jobject obj, const char *name, jlong value); 957d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setLongArrayField(jobject obj, const char *name, jlongArray value); 967d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setLongArrayElement(jobject obj, const char *name, int index, jlong value); 977d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jboolean setStringField(jobject obj, const char *name, const char *value); 987d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void reportEvent(jclass cls, const char *method, const char *signature, ...); 997d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> createObject(const char *className); 1003592af2adb0c30244a46db03164ca0f7e6d3b613mukesh agrawal JNIObject<jobject> createObjectWithArgs(const char *className, const char *signature, ...); 1017d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobjectArray> createObjectArray(const char *className, int size); 1027d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setObjectField(jobject obj, const char *name, const char *type, jobject value); 103956f54b391677d78379729dd14518edddf3c7660Etan Cohen void callMethod(jobject obj, const char *method, const char *signature, ...); 1047d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1057d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande /* helpers to deal with static members */ 1067d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jlong getStaticLongField(jobject obj, const char *name); 1077d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jlong getStaticLongField(jclass cls, const char *name); 1087d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setStaticLongField(jobject obj, const char *name, jlong value); 1097d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setStaticLongField(jclass cls, const char *name, jlong value); 1107d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jlong getStaticLongArrayField(jobject obj, const char *name, int index); 1117d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jlong getStaticLongArrayField(jclass cls, const char *name, int index); 1127d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setStaticLongArrayField(jobject obj, const char *name, jlongArray value); 1137d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setStaticLongArrayField(jclass obj, const char *name, jlongArray value); 1147d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jboolean callStaticMethod(jclass cls, const char *method, const char *signature, ...); 1157d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1167d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> getObjectArrayElement(jobjectArray array, int index); 1177d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobject> getObjectArrayElement(jobject array, int index); 1187d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande int getArrayLength(jarray array); 1197d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jobjectArray> newObjectArray(int num, const char *className, jobject val); 1207d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jbyteArray> newByteArray(int num); 1217d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jintArray> newIntArray(int num); 1227d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jlongArray> newLongArray(int num); 1237d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jstring> newStringUTF(const char *utf); 1247d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void setObjectArrayElement(jobjectArray array, int index, jobject obj); 1253592af2adb0c30244a46db03164ca0f7e6d3b613mukesh agrawal void setByteArrayRegion(jbyteArray array, int from, int to, const jbyte *bytes); 1263592af2adb0c30244a46db03164ca0f7e6d3b613mukesh agrawal void setIntArrayRegion(jintArray array, int from, int to, const jint *ints); 1273592af2adb0c30244a46db03164ca0f7e6d3b613mukesh agrawal void setLongArrayRegion(jlongArray array, int from, int to, const jlong *longs); 1287d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1297d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jobject newGlobalRef(jobject obj); 1307d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void deleteGlobalRef(jobject obj); 1317d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1327d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandeprivate: 1337d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande /* Jni wrappers */ 1347d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande friend class JNIObject<jobject>; 1357d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande friend class JNIObject<jstring>; 1367d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande friend class JNIObject<jobjectArray>; 1377d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande friend class JNIObject<jclass>; 1387d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande friend class JNIObject<jlongArray>; 1397d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande friend class JNIObject<jbyteArray>; 1407d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande friend class JNIObject<jintArray>; 1417d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jobject newLocalRef(jobject obj); 1427d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void deleteLocalRef(jobject obj); 1437d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}; 1447d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1457d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T> 1467d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<T>::JNIObject(JNIHelper &helper, T obj) 1477d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande : mHelper(helper), mObj(obj) 1487d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{ } 1497d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1507d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T> 1517d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<T>::JNIObject(const JNIObject<T>& rhs) 1527d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande : mHelper(rhs.mHelper), mObj(NULL) 1537d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{ 1547d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande mObj = (T)mHelper.newLocalRef(rhs.mObj); 1557d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande} 1567d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1577d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T> 1587d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<T>::~JNIObject() { 1597d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande release(); 1607d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande} 1617d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1627d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T> 1637d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIObject<T>::release() 1647d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{ 1657d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande if (mObj != NULL) { 1667d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande mHelper.deleteLocalRef(mObj); 1677d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande mObj = NULL; 1687d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande } 1697f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 1707d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1717d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T> 1727d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeT JNIObject<T>::clone() 1737d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{ 1747d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return mHelper.newLocalRef(mObj); 1757d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande} 1767d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1777d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande} 1787d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1797d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande#define THROW(env, message) (env).throwException(message, __LINE__) 180