Home | History | Annotate | Download | only in jni
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 #include "NfcJniUtil.h"
     17 
     18 #include <cutils/log.h>
     19 #include <errno.h>
     20 #include <JNIHelp.h>
     21 #include <ScopedLocalRef.h>
     22 #include "RoutingManager.h"
     23 
     24 
     25 /*******************************************************************************
     26 **
     27 ** Function:        JNI_OnLoad
     28 **
     29 ** Description:     Register all JNI functions with Java Virtual Machine.
     30 **                  jvm: Java Virtual Machine.
     31 **                  reserved: Not used.
     32 **
     33 ** Returns:         JNI version.
     34 **
     35 *******************************************************************************/
     36 jint JNI_OnLoad (JavaVM* jvm, void*)
     37 {
     38     ALOGD ("%s: enter", __FUNCTION__);
     39     JNIEnv *e = NULL;
     40 
     41     ALOGI("NFC Service: loading nci JNI");
     42 
     43     // Check JNI version
     44     if (jvm->GetEnv ((void **) &e, JNI_VERSION_1_6))
     45         return JNI_ERR;
     46 
     47     if (android::register_com_android_nfc_NativeNfcManager (e) == -1)
     48         return JNI_ERR;
     49     if (android::register_com_android_nfc_NativeLlcpServiceSocket (e) == -1)
     50         return JNI_ERR;
     51     if (android::register_com_android_nfc_NativeLlcpSocket (e) == -1)
     52         return JNI_ERR;
     53     if (android::register_com_android_nfc_NativeNfcTag (e) == -1)
     54         return JNI_ERR;
     55     if (android::register_com_android_nfc_NativeLlcpConnectionlessSocket (e) == -1)
     56         return JNI_ERR;
     57     if (android::register_com_android_nfc_NativeP2pDevice (e) == -1)
     58         return JNI_ERR;
     59     if (RoutingManager::getInstance().registerJniFunctions (e) == -1)
     60         return JNI_ERR;
     61     ALOGD ("%s: exit", __FUNCTION__);
     62     return JNI_VERSION_1_6;
     63 }
     64 
     65 
     66 namespace android
     67 {
     68 
     69 
     70 /*******************************************************************************
     71 **
     72 ** Function:        nfc_jni_cache_object
     73 **
     74 ** Description:
     75 **
     76 ** Returns:         Status code.
     77 **
     78 *******************************************************************************/
     79 int nfc_jni_cache_object (JNIEnv *e, const char *className, jobject *cachedObj)
     80 {
     81     ScopedLocalRef<jclass> cls(e, e->FindClass(className));
     82     if (cls.get() == NULL)
     83     {
     84         ALOGE("%s: find class error", __FUNCTION__);
     85         return -1;
     86     }
     87 
     88     jmethodID ctor = e->GetMethodID(cls.get(), "<init>", "()V");
     89     ScopedLocalRef<jobject> obj(e, e->NewObject(cls.get(), ctor));
     90     if (obj.get() == NULL)
     91     {
     92        ALOGE("%s: create object error", __FUNCTION__);
     93        return -1;
     94     }
     95 
     96     *cachedObj = e->NewGlobalRef(obj.get());
     97     if (*cachedObj == NULL)
     98     {
     99         ALOGE("%s: global ref error", __FUNCTION__);
    100         return -1;
    101     }
    102     return 0;
    103 }
    104 
    105 
    106 /*******************************************************************************
    107 **
    108 ** Function:        nfc_jni_get_nfc_socket_handle
    109 **
    110 ** Description:     Get the value of "mHandle" member variable.
    111 **                  e: JVM environment.
    112 **                  o: Java object.
    113 **
    114 ** Returns:         Value of mHandle.
    115 **
    116 *******************************************************************************/
    117 int nfc_jni_get_nfc_socket_handle (JNIEnv *e, jobject o)
    118 {
    119     ScopedLocalRef<jclass> c(e, e->GetObjectClass(o));
    120     jfieldID f = e->GetFieldID(c.get(), "mHandle", "I");
    121     return e->GetIntField(o, f);
    122 }
    123 
    124 
    125 /*******************************************************************************
    126 **
    127 ** Function:        nfc_jni_get_nat
    128 **
    129 ** Description:     Get the value of "mNative" member variable.
    130 **                  e: JVM environment.
    131 **                  o: Java object.
    132 **
    133 ** Returns:         Pointer to the value of mNative.
    134 **
    135 *******************************************************************************/
    136 struct nfc_jni_native_data* nfc_jni_get_nat(JNIEnv *e, jobject o)
    137 {
    138    ScopedLocalRef<jclass> c(e, e->GetObjectClass(o));
    139    jfieldID f = e->GetFieldID(c.get(), "mNative", "J");
    140    /* Retrieve native structure address */
    141    return (struct nfc_jni_native_data*) e->GetLongField(o, f);
    142 }
    143 
    144 
    145 /*******************************************************************************
    146 **
    147 ** Function         nfc_jni_cache_object_local
    148 **
    149 ** Description      Allocates a java object and calls it's constructor
    150 **
    151 ** Returns          -1 on failure, 0 on success
    152 **
    153 *******************************************************************************/
    154 int nfc_jni_cache_object_local (JNIEnv *e, const char *className, jobject *cachedObj)
    155 {
    156     ScopedLocalRef<jclass> cls(e, e->FindClass(className));
    157     if(cls.get() == NULL)
    158     {
    159         ALOGE ("%s: find class error", __FUNCTION__);
    160         return -1;
    161     }
    162 
    163     jmethodID ctor = e->GetMethodID(cls.get(), "<init>", "()V");
    164     jobject obj = e->NewObject(cls.get(), ctor);
    165     if (obj == NULL)
    166     {
    167        ALOGE ("%s: create object error", __FUNCTION__);
    168        return -1;
    169     }
    170 
    171     *cachedObj = obj;
    172     if (*cachedObj == NULL)
    173     {
    174         ALOGE ("%s: global ref error", __FUNCTION__);
    175         return -1;
    176     }
    177     return 0;
    178 }
    179 
    180 
    181 } // namespace android
    182