aa233480307953b6e2672503540a8502970cb56c
[platform/upstream/iotivity.git] / resource / csdk / connectivity / src / nfc_adapter / android / canfcserver.c
1 /* ****************************************************************j\r
2  *\r
3  * Copyright 2015 Samsung Electronics All Rights Reserved.\r
4  *\r
5  *\r
6  *\r
7  * Licensed under the Apache License, Version 2.0 (the "License");\r
8  * you may not use this file except in compliance with the License.\r
9  * You may obtain a copy of the License at\r
10  *\r
11  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  *\r
13  * Unless required by applicable law or agreed to in writing, software\r
14  * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * See the License for the specific language governing permissions and\r
17  * limitations under the License.\r
18  *\r
19  ******************************************************************/\r
20 #include "canfcinterface.h"\r
21 \r
22 #include "caadapterutils.h"\r
23 #include "camutex.h"\r
24 #include "oic_malloc.h"\r
25 #include "oic_string.h"\r
26 \r
27 /**\r
28  * TAG\r
29  * Logging tag for module name\r
30  */\r
31 #define TAG "NFC_SERVER"\r
32 \r
33 static CANFCPacketReceivedCallback g_packetReceivedCallback;\r
34 \r
35 static JavaVM *g_jvm = NULL;\r
36 static jobject g_context = NULL;\r
37 static jobject g_activity = NULL;\r
38 static jobject g_nfcInterface = NULL;\r
39 static jmethodID g_sendMethod = NULL;\r
40 \r
41 static void CANfcJniInit();\r
42 static void CANfcJNISetContext();\r
43 static CAResult_t CANfcCreateJniInterfaceObject();\r
44 static CAResult_t CANfcSendDataImpl(const CAEndpoint_t * ep, const char* data, uint32_t dataLen);\r
45 \r
46 static const char CLASS_NFCINTERFACE[] = "org/iotivity/ca/CaNfcInterface";\r
47 \r
48 static void CANfcJniInit()\r
49 {\r
50     OIC_LOG(DEBUG, TAG, "CANfcJniInit");\r
51     g_jvm = (JavaVM*) CANativeJNIGetJavaVM();\r
52 }\r
53 \r
54 static void CANfcJNISetContext()\r
55 {\r
56     OIC_LOG(DEBUG, TAG, "CANfcJNISetContext");\r
57     g_context = (jobject) CANativeJNIGetContext();\r
58     g_activity = (jobject) CANativeGetActivity();\r
59 }\r
60 \r
61 void CANFCSetPacketReceiveCallback(CANFCPacketReceivedCallback callback)\r
62 {\r
63     OIC_LOG(DEBUG, TAG, "IN");\r
64 \r
65     g_packetReceivedCallback = callback;\r
66 \r
67     OIC_LOG(DEBUG, TAG, "OUT");\r
68 }\r
69 \r
70 CAResult_t SetCreateNdefMessageCallbackfromNative(JNIEnv* env)\r
71 {\r
72     OIC_LOG(DEBUG, TAG, "SetCreateNdefMessageCallbackfromNative IN");\r
73 \r
74     VERIFY_NON_NULL(env, TAG, "env");\r
75     VERIFY_NON_NULL(g_context, TAG, "g_context");\r
76     VERIFY_NON_NULL(g_activity, TAG, "g_activity");\r
77     VERIFY_NON_NULL(g_nfcInterface, TAG, "g_nfcInterface");\r
78 \r
79     jclass cid_NfcAdapter = (*env)->FindClass(env, "android/nfc/NfcAdapter");\r
80     if (!cid_NfcAdapter)\r
81     {\r
82         OIC_LOG(ERROR, TAG, "Could not get NfcAdapter class");\r
83         return CA_STATUS_FAILED;\r
84     }\r
85 \r
86     jmethodID mid_getAdapter = (*env)->GetStaticMethodID(env, cid_NfcAdapter,\r
87                                        "getDefaultAdapter",\r
88                                        "(Landroid/content/Context;)Landroid/nfc/NfcAdapter;");\r
89     if (!mid_getAdapter)\r
90     {\r
91         OIC_LOG(ERROR, TAG, "Could not get methodId mid_getAdapter");\r
92         return CA_STATUS_FAILED;\r
93     }\r
94 \r
95     jobject adapter = (*env)->CallStaticObjectMethod(env, cid_NfcAdapter, mid_getAdapter,\r
96                                                      g_context);\r
97     if (!adapter)\r
98     {\r
99         OIC_LOG(ERROR, TAG, "Could not get NfcAdapter");\r
100         return CA_STATUS_FAILED;\r
101     }\r
102 \r
103     jmethodID mid_setCallback = (*env)->GetMethodID(\r
104         env, cid_NfcAdapter, "setNdefPushMessageCallback",\r
105         "(Landroid/nfc/NfcAdapter$CreateNdefMessageCallback;Landroid/app/Activity;"\r
106         "[Landroid/app/Activity;)V");\r
107     if (!mid_setCallback)\r
108     {\r
109         OIC_LOG(ERROR, TAG, "Could not get mid_setCallback");\r
110         return CA_STATUS_FAILED;\r
111     }\r
112 \r
113     jclass cid_Activity = (*env)->FindClass(env, "android/app/Activity");\r
114     if (!cid_Activity)\r
115     {\r
116         OIC_LOG(ERROR, TAG, "Could not get Activity class");\r
117         return CA_STATUS_FAILED;\r
118     }\r
119 \r
120     jobjectArray tempArr = (jobjectArray) (*env)->NewObjectArray(env, 0, cid_Activity, NULL);\r
121     (*env)->CallVoidMethod(env, adapter, mid_setCallback, g_nfcInterface, g_activity, tempArr);\r
122 \r
123     OIC_LOG(DEBUG, TAG, "SetCreateNdefMessageCallbackfromNative OUT");\r
124     return CA_STATUS_OK;\r
125 }\r
126 \r
127 CAResult_t CANfcCreateJniInterfaceObject()\r
128 {\r
129     OIC_LOG(DEBUG, TAG, "CANfcCreateJniInterfaceObject IN");\r
130 \r
131     VERIFY_NON_NULL(g_activity, TAG, "g_activity");\r
132     VERIFY_NON_NULL(g_context, TAG, "g_context");\r
133     VERIFY_NON_NULL(g_jvm, TAG, "g_jvm");\r
134 \r
135     bool isAttached = false;\r
136     JNIEnv* env;\r
137     jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);\r
138     if (JNI_OK != res)\r
139     {\r
140         OIC_LOG(INFO, TAG, "Could not get JNIEnv pointer");\r
141         res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);\r
142 \r
143         if (JNI_OK != res)\r
144         {\r
145             OIC_LOG(ERROR, TAG, "AttachCurrentThread has failed");\r
146             return CA_STATUS_FAILED;\r
147         }\r
148         isAttached = true;\r
149     }\r
150 \r
151     jclass jni_NfcInterface = (*env)->FindClass(env, "org/iotivity/ca/CaNfcInterface");\r
152     if (!jni_NfcInterface)\r
153     {\r
154         OIC_LOG(ERROR, TAG, "Could not get CaNfcInterface class");\r
155         goto error_exit;\r
156     }\r
157 \r
158     jmethodID NfcInterfaceConstructorMethod = (*env)->GetMethodID(env, jni_NfcInterface, "<init>",\r
159                                             "(Landroid/content/Context;Landroid/app/Activity;)V");\r
160     if (!NfcInterfaceConstructorMethod)\r
161     {\r
162         OIC_LOG(ERROR, TAG, "Could not get CaNfcInterface constructor method");\r
163         goto error_exit;\r
164     }\r
165 \r
166     jobject jni_nfcInstance = (*env)->NewObject(env, jni_NfcInterface,\r
167                                                 NfcInterfaceConstructorMethod, g_context,\r
168                                                 g_activity);\r
169     if (!jni_nfcInstance)\r
170     {\r
171         OIC_LOG(ERROR, TAG, "Create instance for CaNfcInterface failed");\r
172         goto error_exit;\r
173     }\r
174 \r
175     g_nfcInterface = (*env)->NewGlobalRef(env, jni_nfcInstance);\r
176     if (!g_nfcInterface)\r
177     {\r
178         OIC_LOG(ERROR, TAG, "NewGlobalRef  for nfcInterface failed");\r
179         goto error_exit;\r
180     }\r
181 \r
182     OIC_LOG(DEBUG, TAG, "Create instance for CaNfcInterface");\r
183 \r
184     CAResult_t result = SetCreateNdefMessageCallbackfromNative(env);\r
185     if (CA_STATUS_OK != result)\r
186     {\r
187         OIC_LOG(ERROR, TAG, "SetCreateNdefMessageCallbackfromNative failed");\r
188         goto error_exit;\r
189     }\r
190 \r
191     if (isAttached)\r
192     {\r
193         (*g_jvm)->DetachCurrentThread(g_jvm);\r
194     }\r
195 \r
196     OIC_LOG(DEBUG, TAG, "CANfcCreateJniInterfaceObject OUT");\r
197     return CA_STATUS_OK;\r
198 \r
199 error_exit:\r
200     if (isAttached)\r
201     {\r
202         (*g_jvm)->DetachCurrentThread(g_jvm);\r
203     }\r
204 \r
205     return CA_STATUS_FAILED;\r
206 }\r
207 \r
208 CAResult_t CAInitializeNfcServer()\r
209 {\r
210     CANfcJniInit();\r
211     CANfcJNISetContext();\r
212 \r
213     CAResult_t result = CANfcCreateJniInterfaceObject();\r
214     if (CA_STATUS_OK != result)\r
215     {\r
216         OIC_LOG(ERROR, TAG, "CANfcJniInit failed");\r
217     }\r
218 \r
219     return result;\r
220 }\r
221 \r
222 CAResult_t CANFCStartServer()\r
223 {\r
224     bool isAttached = false;\r
225 \r
226     OIC_LOG(INFO, TAG, "CANFCStartServer : IN");\r
227 \r
228     JNIEnv* env;\r
229     jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);\r
230     if (JNI_OK != res)\r
231     {\r
232         OIC_LOG(INFO, TAG, "Could not get JNIEnv pointer");\r
233         res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);\r
234 \r
235         if (JNI_OK != res)\r
236         {\r
237             OIC_LOG(ERROR, TAG, "AttachCurrentThread has failed");\r
238             return CA_STATUS_FAILED;\r
239         }\r
240         isAttached = true;\r
241     }\r
242 \r
243     jclass jni_NfcInterface = (*env)->FindClass(env, "org/iotivity/ca/CaNfcInterface");\r
244     if (!jni_NfcInterface)\r
245     {\r
246         OIC_LOG(ERROR, TAG, "Could not get CaNFCClientInterface class");\r
247         goto error_exit;\r
248     }\r
249 \r
250     jmethodID methodId = (*env)->GetMethodID(env, jni_NfcInterface, "caNfcInitialize", "()V");\r
251     if (!methodId)\r
252     {\r
253         OIC_LOG(ERROR, TAG, "Could not get methodId");\r
254         goto error_exit;\r
255     }\r
256 \r
257     if (!g_nfcInterface)\r
258     {\r
259         OIC_LOG(ERROR, TAG, "g_nfcInterface NULL");\r
260         goto error_exit;\r
261     }\r
262 \r
263     (*env)->CallVoidMethod(env, g_nfcInterface, methodId);\r
264     OIC_LOG(DEBUG, TAG, "caNfcInitialize");\r
265 \r
266     jmethodID sendDataMethodId = (*env)->GetMethodID(env, jni_NfcInterface, "processSendRquest",\r
267                                                      "([B)V");\r
268     if (!sendDataMethodId)\r
269     {\r
270         OIC_LOG(ERROR, TAG, "Could not get sendDataMethodId");\r
271         goto error_exit;\r
272     }\r
273 \r
274     g_sendMethod = sendDataMethodId;\r
275 \r
276     if (isAttached)\r
277     {\r
278         (*g_jvm)->DetachCurrentThread(g_jvm);\r
279     }\r
280 \r
281     return CA_STATUS_OK;\r
282 \r
283 error_exit:\r
284     if (isAttached)\r
285     {\r
286         (*g_jvm)->DetachCurrentThread(g_jvm);\r
287     }\r
288     return CA_STATUS_FAILED;\r
289 \r
290 }\r
291 \r
292 void CANFCStopServer()\r
293 {\r
294     // JNI Call to unregstier nfc adapter\r
295 }\r
296 \r
297 /*\r
298  * Class:     org_iotivity_ca_CaNfcInterface\r
299  * Method:    caNativeNfcCreateNdefMessage\r
300  * Signature: ([B)Landroid/nfc/NdefMessage;\r
301  */\r
302 JNIEXPORT jobject JNICALL\r
303 Java_org_iotivity_ca_CaNfcInterface_caNativeNfcCreateNdefMessage(JNIEnv *env, jobject obj,\r
304                                                                  jbyteArray sendData)\r
305 {\r
306     OIC_LOG(DEBUG, TAG, "caNativeNfcCreateNdefMessage : IN");\r
307     VERIFY_NON_NULL_RET(env, TAG, "env is null", NULL);\r
308     VERIFY_NON_NULL_RET(obj, TAG, "obj is null", NULL);\r
309 \r
310     const char *mime = "application/org.iotivity.ca.sample_service";\r
311     jstring mimeString = (*env)->NewStringUTF(env, mime);\r
312     if (!mimeString)\r
313     {\r
314         OIC_LOG(ERROR, TAG, "NewStringUTF failed for mimeString");\r
315         return NULL;\r
316     }\r
317 \r
318     const char *type = "US_ASCII";\r
319     jstring charSetString = (*env)->NewStringUTF(env, type);\r
320     if (!charSetString)\r
321     {\r
322         OIC_LOG(ERROR, TAG, "NewStringUTF failed for charSetString");\r
323         return NULL;\r
324     }\r
325 \r
326     jclass cid_string = (*env)->FindClass(env, "java/lang/String");\r
327     if (!cid_string)\r
328     {\r
329         OIC_LOG(ERROR, TAG, "Could not get NfcAdapter class for cid_string");\r
330         return NULL;\r
331     }\r
332 \r
333     jmethodID mid_getBytes = (*env)->GetMethodID(env, cid_string, "getBytes",\r
334                                                  "(Ljava/lang/String;)[B");\r
335     if (!mid_getBytes)\r
336     {\r
337         OIC_LOG(ERROR, TAG, "Could not get methodId for mid_getBytes");\r
338         return NULL;\r
339     }\r
340 \r
341     jbyteArray mimeTypeArr = (*env)->CallObjectMethod(env, mimeString, mid_getBytes,\r
342                                                       charSetString);\r
343     if (!mimeTypeArr)\r
344     {\r
345         OIC_LOG(ERROR, TAG, "getBytes failed for mimeTypeArr");\r
346     }\r
347 \r
348     jclass cid_NdefRecord = (*env)->FindClass(env, "android/nfc/NdefRecord");\r
349     if (!cid_NdefRecord)\r
350     {\r
351         OIC_LOG(ERROR, TAG, "Could not get NdefRecord class for cid_NdefRecord");\r
352         return NULL;\r
353     }\r
354 \r
355     jmethodID mid_createRecord = (*env)->GetMethodID(env, cid_NdefRecord, "<init>",\r
356                                                      "(S[B[B[B)V");\r
357     if (!mid_createRecord)\r
358     {\r
359         OIC_LOG(ERROR, TAG, "Could not get methodId for mid_createRecord");\r
360         return NULL;\r
361     }\r
362 \r
363     jfieldID fid_tnfType = (*env)->GetStaticFieldID(env, cid_NdefRecord, "TNF_MIME_MEDIA", "S");\r
364 \r
365     jint tnfType = (*env)->GetStaticShortField(env, cid_NdefRecord, fid_tnfType);\r
366     OIC_LOG_V(ERROR, TAG, "tnfType : %d", tnfType);\r
367 \r
368     jbyteArray nullArr = (*env)->NewByteArray(env, 0);\r
369 \r
370     jobject ndefRecord = (*env)->NewObject(env, cid_NdefRecord, mid_createRecord, tnfType,\r
371                                            mimeTypeArr, nullArr, sendData);\r
372     if (!ndefRecord)\r
373     {\r
374         OIC_LOG(ERROR, TAG, "createNdefRecord failed for ndefRecord");\r
375         return NULL;\r
376     }\r
377 \r
378     jclass cid_NdefMsg = (*env)->FindClass(env, "android/nfc/NdefMessage");\r
379     if (!cid_NdefMsg)\r
380     {\r
381         OIC_LOG(ERROR, TAG, "Could not get NdefMessage class for cid_NdefMsg");\r
382         return NULL;\r
383     }\r
384 \r
385     jmethodID mid_createMsg = (*env)->GetMethodID(env, cid_NdefMsg, "<init>",\r
386                                                   "([Landroid/nfc/NdefRecord;)V");\r
387     if (!mid_createMsg)\r
388     {\r
389         OIC_LOG(ERROR, TAG, "Could not get methodId for mid_createMsg");\r
390         return NULL;\r
391     }\r
392     jobjectArray tempArr = (jobjectArray) (*env)->NewObjectArray(env, 1, cid_NdefRecord,\r
393                                                                  ndefRecord);\r
394 \r
395     jobject ndefMsg = (*env)->NewObject(env, cid_NdefMsg, mid_createMsg, tempArr);\r
396     if (!ndefMsg)\r
397     {\r
398         OIC_LOG(ERROR, TAG, "createNdefMessage failed for ndefMsg");\r
399         return NULL;\r
400     }\r
401 \r
402     OIC_LOG(DEBUG, TAG, "caNativeNfcCreateNdefMessage : OUT");\r
403     return ndefMsg;\r
404 }\r
405 \r
406 /*\r
407  * Class:     org_iotivity_ca_CaNfcInterface\r
408  * Method:    caNativeNfcInvokeBeam\r
409  * Signature: ()Z\r
410  */\r
411 JNIEXPORT jboolean JNICALL\r
412 Java_org_iotivity_ca_CaNfcInterface_caNativeNfcInvokeBeam(JNIEnv *env, jobject obj)\r
413 {\r
414     OIC_LOG(DEBUG, TAG, "cANativeNfcInvokeBeam : IN");\r
415     VERIFY_NON_NULL_RET(env, TAG, "env is null", false);\r
416     VERIFY_NON_NULL_RET(obj, TAG, "obj is null", false);\r
417     VERIFY_NON_NULL_RET(g_context, TAG, "g_context is null", false);\r
418     VERIFY_NON_NULL_RET(g_activity, TAG, "g_activity is null", false);\r
419 \r
420     jclass cid_NfcAdapter = (*env)->FindClass(env, "android/nfc/NfcAdapter");\r
421     if (!cid_NfcAdapter)\r
422     {\r
423         OIC_LOG(ERROR, TAG, "Could not get NfcAdapter cid_NfcAdapter ");\r
424         return JNI_FALSE;\r
425     }\r
426 \r
427     jmethodID mid_getAdapter = (*env)->GetStaticMethodID(env, cid_NfcAdapter,\r
428                                        "getDefaultAdapter",\r
429                                        "(Landroid/content/Context;)Landroid/nfc/NfcAdapter;");\r
430     if (!mid_getAdapter)\r
431     {\r
432         OIC_LOG(ERROR, TAG, "Could not get methodId mid_getAdapter");\r
433         return JNI_FALSE;\r
434     }\r
435 \r
436     jobject adapter = (*env)->CallStaticObjectMethod(env, cid_NfcAdapter, mid_getAdapter,\r
437                                                      g_context);\r
438     if (!adapter)\r
439     {\r
440         OIC_LOG(ERROR, TAG, "getDefaultAdapter failed adapter");\r
441         return JNI_FALSE;\r
442     }\r
443 \r
444     jmethodID mid_invokeBeam = (*env)->GetMethodID(env, cid_NfcAdapter, "invokeBeam",\r
445                                                    "(Landroid/app/Activity;)Z");\r
446     if (!mid_invokeBeam)\r
447     {\r
448         OIC_LOG(ERROR, TAG, "Could not get methodId mid_invokeBeam");\r
449         return JNI_FALSE;\r
450     }\r
451 \r
452 \r
453     jboolean isSuccess = (*env)->CallBooleanMethod(env, adapter, mid_invokeBeam, g_activity);\r
454     if (!isSuccess)\r
455     {\r
456         OIC_LOG(ERROR, TAG, "invokeBeam has failed");\r
457     }\r
458     OIC_LOG(DEBUG, TAG, "cANativeNfcInvokeBeam : OUT");\r
459 \r
460     return isSuccess;\r
461 }\r
462 \r
463 /*\r
464  * Class:     org_iotivity_ca_CaNfcInterface\r
465  * Method:    caNativeNfcPacketReceived\r
466  * Signature: ([B)V\r
467  */\r
468 JNIEXPORT void JNICALL\r
469 Java_org_iotivity_ca_CaNfcInterface_caNativeNfcPacketReceived(JNIEnv *env, jobject obj,\r
470                                                               jbyteArray data)\r
471 {\r
472     OIC_LOG(DEBUG, TAG, "caNfcPacketReceived : IN");\r
473     VERIFY_NON_NULL_VOID(env, TAG, "env is null");\r
474     VERIFY_NON_NULL_VOID(obj, TAG, "obj is null");\r
475     VERIFY_NON_NULL_VOID(data, TAG, "data is null");\r
476 \r
477     char recvBuffer[COAP_MAX_PDU_SIZE] = {0};\r
478 \r
479     // get Byte Array and covert to char*\r
480     jint length = (*env)->GetArrayLength(env, data);\r
481 \r
482     if (length >= COAP_MAX_PDU_SIZE)\r
483     {\r
484         OIC_LOG_V(ERROR, TAG, "caNfcPacketReceived - Invalid CoAP length : %d",\r
485                   length);\r
486         return;\r
487     }\r
488 \r
489     jboolean isCopy;\r
490     jbyte *jni_received_data = (jbyte*) (*env)->GetByteArrayElements(env, data, &isCopy);\r
491 \r
492     OIC_LOG_V(DEBUG, TAG, "caNfcPacketReceived - raw data received : %s",\r
493               jni_received_data);\r
494 \r
495     memcpy(recvBuffer, (const char*) jni_received_data, length);\r
496     (*env)->ReleaseByteArrayElements(env, data, jni_received_data, JNI_ABORT);\r
497 \r
498     const char* address = "AA:BB:CC:DD:EE:FF";\r
499 \r
500     OIC_LOG_V(DEBUG, TAG, "caNfcPacketReceived - data. : %s, %d",\r
501               recvBuffer, length);\r
502 \r
503     CASecureEndpoint_t sep =\r
504             {.endpoint =\r
505                 {.adapter = CA_ADAPTER_NFC,\r
506                  .flags = CA_DEFAULT_FLAGS\r
507                 }\r
508              };\r
509     OICStrcpy(sep.endpoint.addr, sizeof(sep.endpoint.addr), address);\r
510 \r
511     g_packetReceivedCallback(&sep, recvBuffer, length);\r
512     OIC_LOG(DEBUG, TAG, "caNfcPacketReceived : OUT");\r
513 }\r
514 \r
515 CAResult_t CANfcSendDataImpl(const CAEndpoint_t * ep, const char* data, uint32_t dataLen)\r
516 {\r
517     VERIFY_NON_NULL(ep, TAG, "CANfcSendDataImpl : endpoint is null");\r
518     VERIFY_NON_NULL(data, TAG, "CANfcSendDataImpl : data is null");\r
519     VERIFY_NON_NULL(g_jvm, TAG, "CANfcSendDataImpl : g_jvm is null");\r
520 \r
521     OIC_LOG(INFO, TAG, "CANfcSendDataImpl moved env outside");\r
522     bool isAttached = false;\r
523     JNIEnv* env;\r
524     jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);\r
525     if (JNI_OK != res)\r
526     {\r
527         OIC_LOG(INFO, TAG, "Could not get JNIEnv pointer");\r
528         res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);\r
529 \r
530         if (JNI_OK != res)\r
531         {\r
532             OIC_LOG(ERROR, TAG, "AttachCurrentThread has failed");\r
533             return CA_STATUS_FAILED;\r
534         }\r
535         isAttached = true;\r
536     }\r
537 \r
538     OIC_LOG(INFO, TAG, "creating send buffer");\r
539     jbyteArray sendData = (*env)->NewByteArray(env, dataLen);\r
540     if (!sendData)\r
541     {\r
542         OIC_LOG(ERROR, TAG, "Failed to create ByteArray");\r
543         if (isAttached)\r
544         {\r
545             (*g_jvm)->DetachCurrentThread(g_jvm);\r
546         }\r
547 \r
548         return CA_SEND_FAILED;\r
549 \r
550     }\r
551 \r
552     (*env)->SetByteArrayRegion(env, sendData, 0, dataLen, (jbyte*) data);\r
553 \r
554     (*env)->CallVoidMethod(env, g_nfcInterface, g_sendMethod, sendData);\r
555     OIC_LOG(DEBUG, TAG, "send data through NFC");\r
556 \r
557     (*env)->DeleteLocalRef(env, sendData);\r
558 \r
559     if (isAttached)\r
560     {\r
561         (*g_jvm)->DetachCurrentThread(g_jvm);\r
562     }\r
563 \r
564     return CA_STATUS_OK;\r
565 }\r
566 \r
567 void CANFCSendData(const CAEndpoint_t *endpoint, const void *data, uint32_t dataLength)\r
568 {\r
569     VERIFY_NON_NULL_VOID(endpoint, TAG, "endpoint is NULL");\r
570     VERIFY_NON_NULL_VOID(data, TAG, "data is NULL");\r
571 \r
572     // JNI to Send data\r
573     CANfcSendDataImpl(endpoint, data, dataLength);\r
574     return;\r
575 }\r
576 \r