summaryrefslogtreecommitdiffstats
path: root/core/jni
diff options
context:
space:
mode:
authorSylvain Fonteneau <sylvain.fonteneau@trusted-logic.com>2010-10-17 15:32:33 -0700
committerNick Pelly <npelly@google.com>2010-10-18 19:09:26 -0700
commitdd7341f775ca4d86091f4106d6dfef9214073a7d (patch)
treedb9c4a8ecf76071f21cb7ff76607e855785b0e35 /core/jni
parent453c6d449b6469dde9aae6044dedfe3be0da76c5 (diff)
downloadframeworks_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.cpp84
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)