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 179907358e1374c55440d8fcf5175633315678dbe5Steven Moreland#include <jni.h> 189907358e1374c55440d8fcf5175633315678dbe5Steven Moreland 197f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapndenamespace android { 207f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 217f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde/* JNI Helpers for wifi_hal to WifiNative bridge implementation */ 227f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 237d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandeclass JNIHelper; 247d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 257d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T> 267d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandeclass JNIObject { 277d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandeprotected: 287d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper &mHelper; 297d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande T mObj; 307d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandepublic: 317d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject(JNIHelper &helper, T obj); 327d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject(const JNIObject<T>& rhs); 337d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande virtual ~JNIObject(); 347d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIHelper& getHelper() const { 357d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return mHelper; 367d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande } 377d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande T get() const { 387d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return mObj; 397d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande } 407d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande operator T() const { 417d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return mObj; 427d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande } 437d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande bool isNull() const { 447d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return mObj == NULL; 457d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande } 467d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void release(); 477d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande T detach() { 487d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande T tObj = mObj; 497d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande mObj = NULL; 507d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return tObj; 517d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande } 527d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande T clone(); 537d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<T>& operator = (const JNIObject<T>& rhs) { 547d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande release(); 557d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande mHelper = rhs.mHelper; 567d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande mObj = rhs.mObj; 577d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande return *this; 587d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande } 597d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void print() { 607d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ALOGD("holding %p", mObj); 617d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande } 627d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 637d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandeprivate: 647d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande template<typename T2> 65480554af1be404fe3920605e3c5634497995ff95Chih-Hung Hsieh JNIObject(const JNIObject<T2>& rhs); // NOLINT(implicit) 667d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}; 677d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 687d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandeclass JNIHelper { 697d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JavaVM *mVM; 707d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIEnv *mEnv; 717d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 727d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandepublic : 73480554af1be404fe3920605e3c5634497995ff95Chih-Hung Hsieh explicit JNIHelper(JavaVM *vm); 74480554af1be404fe3920605e3c5634497995ff95Chih-Hung Hsieh explicit JNIHelper(JNIEnv *env); 757d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande ~JNIHelper(); 767d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 777d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande /* helpers to deal with static members */ 787d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande JNIObject<jbyteArray> newByteArray(int num); 793592af2adb0c30244a46db03164ca0f7e6d3b613mukesh agrawal void setByteArrayRegion(jbyteArray array, int from, int to, const jbyte *bytes); 807d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 817d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandeprivate: 827d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande /* Jni wrappers */ 837d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande friend class JNIObject<jbyteArray>; 847d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande jobject newLocalRef(jobject obj); 857d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande void deleteLocalRef(jobject obj); 867d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande}; 877d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 887d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T> 897d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<T>::JNIObject(JNIHelper &helper, T obj) 90b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius : mHelper(helper), mObj(obj) 917d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{ } 927d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 937d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T> 947d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<T>::JNIObject(const JNIObject<T>& rhs) 95b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius : mHelper(rhs.mHelper), mObj(NULL) 967d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{ 97b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius mObj = (T)mHelper.newLocalRef(rhs.mObj); 987d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande} 997d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1007d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T> 1017d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeJNIObject<T>::~JNIObject() { 102b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius release(); 1037d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande} 1047d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1057d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T> 1067d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandevoid JNIObject<T>::release() 1077d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{ 108b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius if (mObj != NULL) { 109b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius mHelper.deleteLocalRef(mObj); 110b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius mObj = NULL; 111b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius } 1127f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde} 1137d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1147d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpandetemplate<typename T> 1157d519b6686ece717fd3890c0656b46155c22a377Vinit DeshpandeT JNIObject<T>::clone() 1167d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande{ 117b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return mHelper.newLocalRef(mObj); 1187d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande} 1197d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande} 1207d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande 1217d519b6686ece717fd3890c0656b46155c22a377Vinit Deshpande#define THROW(env, message) (env).throwException(message, __LINE__) 122