diff options
| author | Sylvain Fonteneau <sylvain.fonteneau@trusted-logic.com> | 2010-10-17 15:32:33 -0700 |
|---|---|---|
| committer | Nick Pelly <npelly@google.com> | 2010-10-18 19:09:26 -0700 |
| commit | dd7341f775ca4d86091f4106d6dfef9214073a7d (patch) | |
| tree | db9c4a8ecf76071f21cb7ff76607e855785b0e35 /core/jni | |
| parent | 453c6d449b6469dde9aae6044dedfe3be0da76c5 (diff) | |
| download | frameworks_base-dd7341f775ca4d86091f4106d6dfef9214073a7d.zip frameworks_base-dd7341f775ca4d86091f4106d6dfef9214073a7d.tar.gz frameworks_base-dd7341f775ca4d86091f4106d6dfef9214073a7d.tar.bz2 | |
Added missing implementation for NdefRecord.
Implemented constructor using a byte array to parse.
Added missing exception in method declaration, leading to update api/current.xml
Change-Id: I2660484aef1225e90c2f32a572041a2c3aecf288
Diffstat (limited to 'core/jni')
| -rw-r--r-- | core/jni/android_nfc_NdefRecord.cpp | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/core/jni/android_nfc_NdefRecord.cpp b/core/jni/android_nfc_NdefRecord.cpp index 8ce1837..9d20d6d 100644 --- a/core/jni/android_nfc_NdefRecord.cpp +++ b/core/jni/android_nfc_NdefRecord.cpp @@ -80,8 +80,92 @@ end: return result; } +static jint android_nfc_NdefRecord_parseNdefRecord(JNIEnv *e, jobject o, + jbyteArray array) +{ + uint16_t status; + jbyte *raw_record; + jsize raw_record_size; + jint ret = -1; + phFriNfc_NdefRecord_t record; + + jfieldID mType, mId, mPayload, mTnf; + jbyteArray type = NULL; + jbyteArray id = NULL; + jbyteArray payload = NULL; + + jclass record_cls = e->GetObjectClass(o); + + raw_record_size = e->GetArrayLength(array); + raw_record = e->GetByteArrayElements(array, NULL); + if (raw_record == NULL) { + goto clean_and_return; + } + + LOGD("phFriNfc_NdefRecord_Parse()"); + status = phFriNfc_NdefRecord_Parse(&record, (uint8_t *)raw_record); + if (status) { + LOGE("phFriNfc_NdefRecord_Parse() returned 0x%04x", status); + goto clean_and_return; + } + LOGD("phFriNfc_NdefRecord_Parse() returned 0x%04x", status); + + /* Set TNF field */ + mTnf = e->GetFieldID(record_cls, "mTnf", "S"); + e->SetShortField(o, mTnf, record.Tnf); + + /* Set type field */ + mType = e->GetFieldID(record_cls, "mType", "[B"); + type = e->NewByteArray(record.TypeLength); + if (type == NULL) { + goto clean_and_return; + } + e->SetByteArrayRegion(type, 0, record.TypeLength, + (jbyte *)record.Type); + e->SetObjectField(o, mType, type); + + /* Set id field */ + mId = e->GetFieldID(record_cls, "mId", "[B"); + id = e->NewByteArray(record.IdLength); + if (id == NULL) { + goto clean_and_return; + } + e->SetByteArrayRegion(id, 0, record.IdLength, + (jbyte *)record.Id); + e->SetObjectField(o, mId, id); + + /* Set payload field */ + mPayload = e->GetFieldID(record_cls, "mPayload", "[B"); + payload = e->NewByteArray(record.PayloadLength); + if (payload == NULL) { + goto clean_and_return; + } + e->SetByteArrayRegion(payload, 0, record.PayloadLength, + (jbyte *)record.PayloadData); + e->SetObjectField(o, mPayload, payload); + + ret = 0; + +clean_and_return: + if (type != NULL) { + e->DeleteLocalRef(type); + } + if (id != NULL) { + e->DeleteLocalRef(id); + } + if (payload != NULL) { + e->DeleteLocalRef(payload); + } + if (raw_record != NULL) { + e->ReleaseByteArrayElements(array, raw_record, JNI_ABORT); + } + + return ret; +} + static JNINativeMethod gMethods[] = { {"generate", "(SS[B[B[B)[B", (void *)android_nfc_NdefRecord_generate}, + {"parseNdefRecord", "([B)I", (void *)android_nfc_NdefRecord_parseNdefRecord}, }; int register_android_nfc_NdefRecord(JNIEnv *e) |
