1f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly/* 2f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * Copyright (C) 2010 The Android Open Source Project 3f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * 4f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * Licensed under the Apache License, Version 2.0 (the "License"); 5f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * you may not use this file except in compliance with the License. 6f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * You may obtain a copy of the License at 7f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * 8f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * http://www.apache.org/licenses/LICENSE-2.0 9f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * 10f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * Unless required by applicable law or agreed to in writing, software 11f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * distributed under the License is distributed on an "AS IS" BASIS, 12f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * See the License for the specific language governing permissions and 14f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * limitations under the License. 15f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly */ 16f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 17f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly#include <semaphore.h> 18b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau#include <errno.h> 19f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 20c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly#include "com_android_nfc.h" 21f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 22f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pellynamespace android { 23f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 24c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pellyextern void nfc_jni_llcp_transport_socket_err_callback(void* pContext, 25b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau uint8_t nErrCode); 26f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly/* 27f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * Callbacks 28f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly */ 29c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pellystatic void nfc_jni_llcp_accept_socket_callback(void* pContext, 30b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau NFCSTATUS status) 31f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 32b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau struct nfc_jni_callback_data * pCallbackData = (struct nfc_jni_callback_data *) pContext; 33c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly LOG_CALLBACK("nfc_jni_llcp_accept_socket_callback", status); 34f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 35b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Report the callback status and wake up the caller */ 36b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau pCallbackData->status = status; 37b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau sem_post(&pCallbackData->sem); 38f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} 39f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 40f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 41f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly/* 4252e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau * Utils 4352e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau */ 4452e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau 4552e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneaustatic phLibNfc_Handle getIncomingSocket(nfc_jni_native_monitor_t * pMonitor, 4652e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau phLibNfc_Handle hServerSocket) 4752e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau{ 4852e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau nfc_jni_listen_data_t * pListenData; 4952e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau phLibNfc_Handle pIncomingSocket = NULL; 5052e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau 5152e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau /* Look for a pending incoming connection on the current server */ 5252e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau LIST_FOREACH(pListenData, &pMonitor->incoming_socket_head, entries) 5352e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau { 5452e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau if (pListenData->pServerSocket == hServerSocket) 5552e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau { 5652e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau pIncomingSocket = pListenData->pIncomingSocket; 5752e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau LIST_REMOVE(pListenData, entries); 5852e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau free(pListenData); 5952e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau break; 6052e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau } 6152e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau } 6252e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau 6352e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau return pIncomingSocket; 6452e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau} 6552e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau 6652e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau/* 67f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * Methods 68f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly */ 6993915e1c6fe6d5d16fcebeda610782bf5812c9b4Nick Pellystatic jobject com_NativeLlcpServiceSocket_doAccept(JNIEnv *e, jobject o, jint miu, jint rw, jint linearBufferLength) 70f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 7152e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau NFCSTATUS ret = NFCSTATUS_SUCCESS; 72f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly struct timespec ts; 73f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly phLibNfc_Llcp_sSocketOptions_t sOptions; 74f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly phNfc_sData_t sWorkingBuffer; 75f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly jfieldID f; 76f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly jclass clsNativeLlcpSocket; 77b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau jobject clientSocket = NULL; 78b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau struct nfc_jni_callback_data cb_data; 7952e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau phLibNfc_Handle hIncomingSocket, hServerSocket; 8052e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau nfc_jni_native_monitor_t * pMonitor = nfc_jni_get_monitor(); 81c1b883338c7e909047b8d88251307ffd52c45174Sylvain Fonteneau 82b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Create the local semaphore */ 83b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau if (!nfc_cb_data_init(&cb_data, NULL)) 84b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau { 85b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 86b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau } 87b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 8852e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau /* Get server socket */ 8952e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau hServerSocket = nfc_jni_get_nfc_socket_handle(e,o); 9052e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau 91f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly /* Set socket options with the socket options of the service */ 92f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly sOptions.miu = miu; 93f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly sOptions.rw = rw; 94f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 95f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly /* Allocate Working buffer length */ 96f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly sWorkingBuffer.buffer = (uint8_t*)malloc((miu*rw)+miu+linearBufferLength); 97f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly sWorkingBuffer.length = (miu*rw)+ miu + linearBufferLength; 98ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton 9952e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau while(cb_data.status != NFCSTATUS_SUCCESS) 100b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau { 10152e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau /* Wait for tag Notification */ 10252e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau pthread_mutex_lock(&pMonitor->incoming_socket_mutex); 10352e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau while ((hIncomingSocket = getIncomingSocket(pMonitor, hServerSocket)) == NULL) { 10452e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau pthread_cond_wait(&pMonitor->incoming_socket_cond, &pMonitor->incoming_socket_mutex); 10552e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau } 10652e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau pthread_mutex_unlock(&pMonitor->incoming_socket_mutex); 10752e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau 10852e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau /* Accept the incomming socket */ 10952e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau TRACE("phLibNfc_Llcp_Accept()"); 11052e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau REENTRANCE_LOCK(); 11152e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau ret = phLibNfc_Llcp_Accept( hIncomingSocket, 11252e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau &sOptions, 11352e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau &sWorkingBuffer, 11452e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau nfc_jni_llcp_transport_socket_err_callback, 11552e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau nfc_jni_llcp_accept_socket_callback, 11652e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau (void*)&cb_data); 11752e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau REENTRANCE_UNLOCK(); 11852e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau if(ret != NFCSTATUS_PENDING) 11952e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau { 12052e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau // NOTE: This may happen if link went down since incoming socket detected, then 12152e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau // just drop it and start a new accept loop. 1227d4e962f71c5db6d71aca046bd1416f53a10653bSteve Block ALOGD("phLibNfc_Llcp_Accept() returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); 12352e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau continue; 12452e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau } 12552e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau TRACE("phLibNfc_Llcp_Accept() returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); 12652e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau 12752e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau /* Wait for callback response */ 12852e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau if(sem_wait(&cb_data.sem)) 12952e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau { 130afc8705e932af9a3a27239b0ca6fdb2026f15dfcSteve Block ALOGE("Failed to wait for semaphore (errno=0x%08x)", errno); 13152e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau goto clean_and_return; 13252e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau } 13352e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau 13452e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau if(cb_data.status != NFCSTATUS_SUCCESS) 13552e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau { 13652e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau /* NOTE: Do not generate an error if the accept failed to avoid error in server application */ 1377d4e962f71c5db6d71aca046bd1416f53a10653bSteve Block ALOGD("Failed to accept incoming socket 0x%04x[%s]", cb_data.status, nfc_jni_get_status_name(cb_data.status)); 13852e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau } 139b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau } 140ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton 141b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Create new LlcpSocket object */ 142642ab20c81425ba93e206d2a30602cd67ae8bd38Martijn Coenen if(nfc_jni_cache_object(e,"com/android/nfc/dhimpl/NativeLlcpSocket",&(clientSocket)) == -1) 143b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau { 1447d4e962f71c5db6d71aca046bd1416f53a10653bSteve Block ALOGD("LLCP Socket creation error"); 145b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 146f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 147b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 148b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Get NativeConnectionOriented class object */ 149b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau clsNativeLlcpSocket = e->GetObjectClass(clientSocket); 150b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau if(e->ExceptionCheck()) 151f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 1527d4e962f71c5db6d71aca046bd1416f53a10653bSteve Block ALOGD("LLCP Socket get class object error"); 153b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau goto clean_and_return; 154b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau } 155b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 156b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Set socket handle */ 157b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau f = e->GetFieldID(clsNativeLlcpSocket, "mHandle", "I"); 15852e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau e->SetIntField(clientSocket, f,(jint)hIncomingSocket); 159b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 160b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Set socket MIU */ 161b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau f = e->GetFieldID(clsNativeLlcpSocket, "mLocalMiu", "I"); 162b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau e->SetIntField(clientSocket, f,(jint)miu); 163b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 164b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau /* Set socket RW */ 165b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau f = e->GetFieldID(clsNativeLlcpSocket, "mLocalRw", "I"); 166b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau e->SetIntField(clientSocket, f,(jint)rw); 167b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 16852e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau TRACE("socket handle 0x%02x: MIU = %d, RW = %d\n",hIncomingSocket, miu, rw); 169b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau 170b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneauclean_and_return: 171b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau nfc_cb_data_deinit(&cb_data); 172b78172c6c46957cc37786b690db9bc854b26b7f9Sylvain Fonteneau return clientSocket; 173f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} 174f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 17593915e1c6fe6d5d16fcebeda610782bf5812c9b4Nick Pellystatic jboolean com_NativeLlcpServiceSocket_doClose(JNIEnv *e, jobject o) 176f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 177f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly NFCSTATUS ret; 178f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly phLibNfc_Handle hLlcpSocket; 17952e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau nfc_jni_native_monitor_t * pMonitor = nfc_jni_get_monitor(); 18052e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau 181ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("Close Service socket"); 18252e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau 183f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly /* Retrieve socket handle */ 184c2fdb614879c601b5162d5d93d705b05c7b1e072Nick Pelly hLlcpSocket = nfc_jni_get_nfc_socket_handle(e,o); 185f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 18652e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau pthread_mutex_lock(&pMonitor->incoming_socket_mutex); 18752e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau /* TODO: implement accept abort */ 18852e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau pthread_cond_broadcast(&pMonitor->incoming_socket_cond); 18952e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau pthread_mutex_unlock(&pMonitor->incoming_socket_mutex); 19052e3711950d017debd9f1783a33a0c9ac90dd51bSylvain Fonteneau 191f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly REENTRANCE_LOCK(); 192f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly ret = phLibNfc_Llcp_Close(hLlcpSocket); 193f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly REENTRANCE_UNLOCK(); 194f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly if(ret == NFCSTATUS_SUCCESS) 195f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 196ef92efa7fd86d75cc35465b84e8740f941ff0f0aJeff Hamilton TRACE("Close Service socket OK"); 197f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly return TRUE; 198f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 199f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly else 200f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly { 2017d4e962f71c5db6d71aca046bd1416f53a10653bSteve Block ALOGD("Close Service socket KO"); 202f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly return FALSE; 203f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly } 204f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} 205f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 206f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 207f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly/* 208f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly * JNI registration. 209f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly */ 210f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pellystatic JNINativeMethod gMethods[] = 211f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 212642ab20c81425ba93e206d2a30602cd67ae8bd38Martijn Coenen {"doAccept", "(III)Lcom/android/nfc/dhimpl/NativeLlcpSocket;", 21393915e1c6fe6d5d16fcebeda610782bf5812c9b4Nick Pelly (void *)com_NativeLlcpServiceSocket_doAccept}, 214f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 215f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly {"doClose", "()Z", 21693915e1c6fe6d5d16fcebeda610782bf5812c9b4Nick Pelly (void *)com_NativeLlcpServiceSocket_doClose}, 217f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly}; 218f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 219f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 22013d8819d9d716c8f0ba03288d058f0bd462d70a7Nick Pellyint register_com_android_nfc_NativeLlcpServiceSocket(JNIEnv *e) 221f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly{ 222f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly return jniRegisterNativeMethods(e, 223642ab20c81425ba93e206d2a30602cd67ae8bd38Martijn Coenen "com/android/nfc/dhimpl/NativeLlcpServiceSocket", 224f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly gMethods, NELEM(gMethods)); 225f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} 226f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly 227f067256d9556b1e01143f9ae2fd824fa5dc03138Nick Pelly} // namespace android 228