static jint com_android_nfc_NativeLlcpSocket_doReceive(JNIEnv *e, jobject o, jbyteArray buffer) { NFCSTATUS ret; struct timespec ts; phLibNfc_Handle hLlcpSocket; phNfc_sData_t sReceiveBuffer; /* Retrieve socket handle */ hLlcpSocket = nfc_jni_get_nfc_socket_handle(e,o); sReceiveBuffer.buffer = (uint8_t*)e->GetByteArrayElements(buffer, NULL); sReceiveBuffer.length = (uint32_t)e->GetArrayLength(buffer); TRACE("phLibNfc_Llcp_Recv()"); REENTRANCE_LOCK(); ret = phLibNfc_Llcp_Recv(hLlcpSocket, &sReceiveBuffer, nfc_jni_receive_callback, (void*)hLlcpSocket); REENTRANCE_UNLOCK(); if((ret != NFCSTATUS_SUCCESS) && (ret != NFCSTATUS_PENDING)) { /* Return status should be either SUCCESS or PENDING */ LOGE("phLibNfc_Llcp_Recv() returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); return 0; } TRACE("phLibNfc_Llcp_Recv() returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); /* Wait for callback response (happen if status is either SUCCESS or PENDING) */ if(sem_wait(nfc_jni_llcp_sem) == -1) { return 0; } if(nfc_jni_cb_status == NFCSTATUS_SUCCESS) { return sReceiveBuffer.length; } else { return 0; } }
static jint com_android_nfc_NativeLlcpSocket_doReceive(JNIEnv *e, jobject o, jbyteArray buffer) { NFCSTATUS ret; struct timespec ts; phLibNfc_Handle hRemoteDevice; phLibNfc_Handle hLlcpSocket; phNfc_sData_t sReceiveBuffer = {NULL, 0}; struct nfc_jni_callback_data cb_data; jint result = -1; /* Retrieve handles */ hRemoteDevice = nfc_jni_get_p2p_device_handle(e,o); hLlcpSocket = nfc_jni_get_nfc_socket_handle(e,o); /* Create the local semaphore */ if (!nfc_cb_data_init(&cb_data, NULL)) { goto clean_and_return; } sReceiveBuffer.buffer = (uint8_t*)e->GetByteArrayElements(buffer, NULL); sReceiveBuffer.length = (uint32_t)e->GetArrayLength(buffer); TRACE("phLibNfc_Llcp_Recv()"); REENTRANCE_LOCK(); ret = phLibNfc_Llcp_Recv(hRemoteDevice, hLlcpSocket, &sReceiveBuffer, nfc_jni_receive_callback, (void*)&cb_data); REENTRANCE_UNLOCK(); if(ret == NFCSTATUS_PENDING) { /* Wait for callback response */ if(sem_wait(&cb_data.sem)) { ALOGE("Failed to wait for semaphore (errno=0x%08x)", errno); goto clean_and_return; } if(cb_data.status == NFCSTATUS_SUCCESS) { result = sReceiveBuffer.length; } } else if (ret == NFCSTATUS_SUCCESS) { result = sReceiveBuffer.length; } else { /* Return status should be either SUCCESS or PENDING */ ALOGE("phLibNfc_Llcp_Recv() returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); goto clean_and_return; } TRACE("phLibNfc_Llcp_Recv() returned 0x%04x[%s]", ret, nfc_jni_get_status_name(ret)); clean_and_return: if (sReceiveBuffer.buffer != NULL) { e->ReleaseByteArrayElements(buffer, (jbyte*)sReceiveBuffer.buffer, 0); } nfc_cb_data_deinit(&cb_data); return result; }