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 
     17 #pragma once
     18 #include <jni.h>
     19 #include <pthread.h>
     20 #include <semaphore.h>
     21 #include <sys/queue.h>
     22 
     23 /* Discovery modes -- keep in sync with NFCManager.DISCOVERY_MODE_* */
     24 #define DISCOVERY_MODE_TAG_READER 0
     25 #define DISCOVERY_MODE_NFCIP1 1
     26 #define DISCOVERY_MODE_CARD_EMULATION 2
     27 #define DISCOVERY_MODE_TABLE_SIZE 3
     28 
     29 #define DISCOVERY_MODE_DISABLED 0
     30 #define DISCOVERY_MODE_ENABLED 1
     31 
     32 #define MODE_P2P_TARGET 0
     33 #define MODE_P2P_INITIATOR 1
     34 
     35 /* Properties values */
     36 #define PROPERTY_LLCP_LTO 0
     37 #define PROPERTY_LLCP_MIU 1
     38 #define PROPERTY_LLCP_WKS 2
     39 #define PROPERTY_LLCP_OPT 3
     40 #define PROPERTY_NFC_DISCOVERY_A 4
     41 #define PROPERTY_NFC_DISCOVERY_B 5
     42 #define PROPERTY_NFC_DISCOVERY_F 6
     43 #define PROPERTY_NFC_DISCOVERY_15693 7
     44 #define PROPERTY_NFC_DISCOVERY_NCFIP 8
     45 
     46 /* Error codes */
     47 #define ERROR_BUFFER_TOO_SMALL (-12)
     48 #define ERROR_INSUFFICIENT_RESOURCES (-9)
     49 
     50 /* Pre-defined tag type values. These must match the values in
     51  * Ndef.java in the framework.
     52  */
     53 #define NDEF_UNKNOWN_TYPE (-1)
     54 #define NDEF_TYPE1_TAG 1
     55 #define NDEF_TYPE2_TAG 2
     56 #define NDEF_TYPE3_TAG 3
     57 #define NDEF_TYPE4_TAG 4
     58 #define NDEF_MIFARE_CLASSIC_TAG 101
     59 
     60 /* Pre-defined card read/write state values. These must match the values in
     61  * Ndef.java in the framework.
     62  */
     63 #define NDEF_MODE_READ_ONLY 1
     64 #define NDEF_MODE_READ_WRITE 2
     65 #define NDEF_MODE_UNKNOWN 3
     66 
     67 /* Name strings for target types. These *must* match the values in
     68  * TagTechnology.java */
     69 #define TARGET_TYPE_UNKNOWN (-1)
     70 #define TARGET_TYPE_ISO14443_3A 1
     71 #define TARGET_TYPE_ISO14443_3B 2
     72 #define TARGET_TYPE_ISO14443_4 3
     73 #define TARGET_TYPE_FELICA 4
     74 #define TARGET_TYPE_V 5
     75 #define TARGET_TYPE_NDEF 6
     76 #define TARGET_TYPE_NDEF_FORMATABLE 7
     77 #define TARGET_TYPE_MIFARE_CLASSIC 8
     78 #define TARGET_TYPE_MIFARE_UL 9
     79 #define TARGET_TYPE_KOVIO_BARCODE 10
     80 
     81 // define a few NXP error codes that NFC service expects;
     82 // see external/libnfc-nxp/src/phLibNfcStatus.h;
     83 // see external/libnfc-nxp/inc/phNfcStatus.h
     84 #define NFCSTATUS_SUCCESS (0x0000)
     85 #define NFCSTATUS_FAILED (0x00FF)
     86 
     87 struct nfc_jni_native_data {
     88   /* Thread handle */
     89   pthread_t thread;
     90   int running;
     91 
     92   /* Our VM */
     93   JavaVM* vm;
     94   int env_version;
     95 
     96   /* Reference to the NFCManager instance */
     97   jobject manager;
     98 
     99   /* Cached objects */
    100   jobject cached_NfcTag;
    101   jobject cached_P2pDevice;
    102 
    103   /* Secure Element selected */
    104   int seId;
    105 
    106   /* LLCP params */
    107   int lto;
    108   int miu;
    109   int wks;
    110   int opt;
    111 
    112   int tech_mask;
    113   int discovery_duration;
    114 
    115   /* Tag detected */
    116   jobject tag;
    117 
    118   int tHandle;
    119   int tProtocols[16];
    120   int handles[16];
    121 };
    122 
    123 class ScopedAttach {
    124  public:
    125   ScopedAttach(JavaVM* vm, JNIEnv** env) : vm_(vm) {
    126     vm_->AttachCurrentThread(env, NULL);
    127   }
    128 
    129   ~ScopedAttach() { vm_->DetachCurrentThread(); }
    130 
    131  private:
    132   JavaVM* vm_;
    133 };
    134 
    135 jint JNI_OnLoad(JavaVM* jvm, void* reserved);
    136 
    137 namespace android {
    138 int nfc_jni_cache_object(JNIEnv* e, const char* clsname, jobject* cached_obj);
    139 int nfc_jni_cache_object_local(JNIEnv* e, const char* className,
    140                                jobject* cachedObj);
    141 int nfc_jni_get_nfc_socket_handle(JNIEnv* e, jobject o);
    142 struct nfc_jni_native_data* nfc_jni_get_nat(JNIEnv* e, jobject o);
    143 int register_com_android_nfc_NativeNfcManager(JNIEnv* e);
    144 int register_com_android_nfc_NativeNfcTag(JNIEnv* e);
    145 int register_com_android_nfc_NativeP2pDevice(JNIEnv* e);
    146 int register_com_android_nfc_NativeLlcpConnectionlessSocket(JNIEnv* e);
    147 int register_com_android_nfc_NativeLlcpServiceSocket(JNIEnv* e);
    148 int register_com_android_nfc_NativeLlcpSocket(JNIEnv* e);
    149 }  // namespace android
    150