/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "NfcJniUtil.h" #include <android-base/stringprintf.h> #include <base/logging.h> #include <errno.h> #include <log/log.h> #include <nativehelper/JNIHelp.h> #include <nativehelper/ScopedLocalRef.h> #include "RoutingManager.h" using android::base::StringPrintf; extern bool nfc_debug_enabled; /******************************************************************************* ** ** Function: JNI_OnLoad ** ** Description: Register all JNI functions with Java Virtual Machine. ** jvm: Java Virtual Machine. ** reserved: Not used. ** ** Returns: JNI version. ** *******************************************************************************/ jint JNI_OnLoad(JavaVM* jvm, void*) { DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s: enter", __func__); JNIEnv* e = NULL; LOG(INFO) << StringPrintf("NFC Service: loading nci JNI"); // Check JNI version if (jvm->GetEnv((void**)&e, JNI_VERSION_1_6)) return JNI_ERR; if (android::register_com_android_nfc_NativeNfcManager(e) == -1) return JNI_ERR; if (android::register_com_android_nfc_NativeLlcpServiceSocket(e) == -1) return JNI_ERR; if (android::register_com_android_nfc_NativeLlcpSocket(e) == -1) return JNI_ERR; if (android::register_com_android_nfc_NativeNfcTag(e) == -1) return JNI_ERR; if (android::register_com_android_nfc_NativeLlcpConnectionlessSocket(e) == -1) return JNI_ERR; if (android::register_com_android_nfc_NativeP2pDevice(e) == -1) return JNI_ERR; if (RoutingManager::getInstance().registerJniFunctions(e) == -1) return JNI_ERR; DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s: exit", __func__); return JNI_VERSION_1_6; } namespace android { /******************************************************************************* ** ** Function: nfc_jni_cache_object ** ** Description: ** ** Returns: Status code. ** *******************************************************************************/ int nfc_jni_cache_object(JNIEnv* e, const char* className, jobject* cachedObj) { ScopedLocalRef<jclass> cls(e, e->FindClass(className)); if (cls.get() == NULL) { LOG(ERROR) << StringPrintf("%s: find class error", __func__); return -1; } jmethodID ctor = e->GetMethodID(cls.get(), "<init>", "()V"); ScopedLocalRef<jobject> obj(e, e->NewObject(cls.get(), ctor)); if (obj.get() == NULL) { LOG(ERROR) << StringPrintf("%s: create object error", __func__); return -1; } *cachedObj = e->NewGlobalRef(obj.get()); if (*cachedObj == NULL) { LOG(ERROR) << StringPrintf("%s: global ref error", __func__); return -1; } return 0; } /******************************************************************************* ** ** Function: nfc_jni_get_nfc_socket_handle ** ** Description: Get the value of "mHandle" member variable. ** e: JVM environment. ** o: Java object. ** ** Returns: Value of mHandle. ** *******************************************************************************/ int nfc_jni_get_nfc_socket_handle(JNIEnv* e, jobject o) { ScopedLocalRef<jclass> c(e, e->GetObjectClass(o)); jfieldID f = e->GetFieldID(c.get(), "mHandle", "I"); return e->GetIntField(o, f); } /******************************************************************************* ** ** Function: nfc_jni_get_nat ** ** Description: Get the value of "mNative" member variable. ** e: JVM environment. ** o: Java object. ** ** Returns: Pointer to the value of mNative. ** *******************************************************************************/ struct nfc_jni_native_data* nfc_jni_get_nat(JNIEnv* e, jobject o) { ScopedLocalRef<jclass> c(e, e->GetObjectClass(o)); jfieldID f = e->GetFieldID(c.get(), "mNative", "J"); /* Retrieve native structure address */ return (struct nfc_jni_native_data*)e->GetLongField(o, f); } /******************************************************************************* ** ** Function nfc_jni_cache_object_local ** ** Description Allocates a java object and calls it's constructor ** ** Returns -1 on failure, 0 on success ** *******************************************************************************/ int nfc_jni_cache_object_local(JNIEnv* e, const char* className, jobject* cachedObj) { ScopedLocalRef<jclass> cls(e, e->FindClass(className)); if (cls.get() == NULL) { LOG(ERROR) << StringPrintf("%s: find class error", __func__); return -1; } jmethodID ctor = e->GetMethodID(cls.get(), "<init>", "()V"); jobject obj = e->NewObject(cls.get(), ctor); if (obj == NULL) { LOG(ERROR) << StringPrintf("%s: create object error", __func__); return -1; } *cachedObj = obj; if (*cachedObj == NULL) { LOG(ERROR) << StringPrintf("%s: global ref error", __func__); return -1; } return 0; } } // namespace android