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