1525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*
2525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Copyright (C) 2012 The Android Open Source Project
3525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *
4525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * you may not use this file except in compliance with the License.
6525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * You may obtain a copy of the License at
7525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *
8525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project *
10525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * See the License for the specific language governing permissions and
14525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * limitations under the License.
15525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */
16525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "NfcJniUtil.h"
177b223358c5564a7bc7c72a74889f61fbc5a3cc27Ruben Brunk
187b223358c5564a7bc7c72a74889f61fbc5a3cc27Ruben Brunk#include <cutils/log.h>
19525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include <errno.h>
207b223358c5564a7bc7c72a74889f61fbc5a3cc27Ruben Brunk#include <JNIHelp.h>
212534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes#include <ScopedLocalRef.h>
22525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
23525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
24525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
25525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
26525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        JNI_OnLoad
27525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
28525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Register all JNI functions with Java Virtual Machine.
29525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  jvm: Java Virtual Machine.
30525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  reserved: Not used.
31525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
32525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         JNI version.
33525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
34525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
352534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughesjint JNI_OnLoad (JavaVM* jvm, void*)
36525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
37525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: enter", __FUNCTION__);
38525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    JNIEnv *e = NULL;
39525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
402534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ALOGI("NFC Service: loading nci JNI");
412534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes
42525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    // Check JNI version
43525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (jvm->GetEnv ((void **) &e, JNI_VERSION_1_6))
44525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return JNI_ERR;
45525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
46525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (android::register_com_android_nfc_NativeNfcManager (e) == -1)
47525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return JNI_ERR;
48525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (android::register_com_android_nfc_NativeLlcpServiceSocket (e) == -1)
49525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return JNI_ERR;
50525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (android::register_com_android_nfc_NativeLlcpSocket (e) == -1)
51525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return JNI_ERR;
52525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (android::register_com_android_nfc_NativeNfcTag (e) == -1)
53525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return JNI_ERR;
54525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (android::register_com_android_nfc_NativeLlcpConnectionlessSocket (e) == -1)
55525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return JNI_ERR;
56525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (android::register_com_android_nfc_NativeP2pDevice (e) == -1)
57525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return JNI_ERR;
58525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    if (android::register_com_android_nfc_NativeNfcSecureElement (e) == -1)
59525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return JNI_ERR;
60525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    ALOGD ("%s: exit", __FUNCTION__);
61525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return JNI_VERSION_1_6;
62525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
63525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
64525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
65525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectnamespace android
66525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
67525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
68525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
69525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
70525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
71525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfc_jni_cache_object
72525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
73525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:
74525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
75525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Status code.
76525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
77525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
78525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectint nfc_jni_cache_object (JNIEnv *e, const char *className, jobject *cachedObj)
79525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
802534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jclass> cls(e, e->FindClass(className));
81a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    if (cls.get() == NULL)
82a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    {
832534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        ALOGE("%s: find class error", __FUNCTION__);
84525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return -1;
85525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
86525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
872534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jmethodID ctor = e->GetMethodID(cls.get(), "<init>", "()V");
882534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jobject> obj(e, e->NewObject(cls.get(), ctor));
89a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    if (obj.get() == NULL)
90a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    {
912534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes       ALOGE("%s: create object error", __FUNCTION__);
92525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project       return -1;
93525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
94525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
952534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    *cachedObj = e->NewGlobalRef(obj.get());
96a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    if (*cachedObj == NULL)
97a8aa07142ea0078d3ae4ae486e094e2f2f4ff732Evan Chu    {
982534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes        ALOGE("%s: global ref error", __FUNCTION__);
99525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project        return -1;
100525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    }
101525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project    return 0;
102525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
103525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
104525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
105525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
106525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
107525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfc_jni_get_nfc_socket_handle
108525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
109525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Get the value of "mHandle" member variable.
110525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
111525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
112525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
113525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Value of mHandle.
114525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
115525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
116525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectint nfc_jni_get_nfc_socket_handle (JNIEnv *e, jobject o)
117525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1182534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    ScopedLocalRef<jclass> c(e, e->GetObjectClass(o));
1192534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    jfieldID f = e->GetFieldID(c.get(), "mHandle", "I");
1202534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes    return e->GetIntField(o, f);
121525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
122525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
123525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
124525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/*******************************************************************************
125525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
126525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function:        nfc_jni_get_nat
127525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
128525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description:     Get the value of "mNative" member variable.
129525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  e: JVM environment.
130525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**                  o: Java object.
131525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
132525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns:         Pointer to the value of mNative.
133525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project**
134525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/
135525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectstruct nfc_jni_native_data* nfc_jni_get_nat(JNIEnv *e, jobject o)
136525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{
1372534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes   ScopedLocalRef<jclass> c(e, e->GetObjectClass(o));
1382534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes   jfieldID f = e->GetFieldID(c.get(), "mNative", "I");
139525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project   /* Retrieve native structure address */
1402534d9a546f24435d9dab8168f9ea5bf8ca1eb9bElliott Hughes   return (struct nfc_jni_native_data*) e->GetIntField(o, f);
141525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project}
142525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
143525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project
144525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} // namespace android
145