X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=service%2Fresource-encapsulation%2Fandroid%2Fservice%2Fsrc%2Fmain%2Fjni%2FJniRcsValue.cpp;h=cb1639faa2e561d318433131035dcf13ad455654;hb=7f00f942c39b7bc27c7eeecf213a239c3fe4173c;hp=46ea958954a511048b43d5d7edf7ff56c2b75fb1;hpb=edcfc3d2329da7b914771c0dcff5f42c9b74fd93;p=platform%2Fupstream%2Fiotivity.git diff --git a/service/resource-encapsulation/android/service/src/main/jni/JniRcsValue.cpp b/service/resource-encapsulation/android/service/src/main/jni/JniRcsValue.cpp index 46ea958..cb1639f 100644 --- a/service/resource-encapsulation/android/service/src/main/jni/JniRcsValue.cpp +++ b/service/resource-encapsulation/android/service/src/main/jni/JniRcsValue.cpp @@ -56,6 +56,7 @@ namespace jobject g_obj_TypeId_Integer; jobject g_obj_TypeId_Double; jobject g_obj_TypeId_String; + jobject g_obj_TypeId_ByteString; jobject g_obj_TypeId_Attributes; jobject g_obj_TypeId_Array; @@ -189,6 +190,68 @@ namespace static constexpr char className[] = "L" CLS_NAME_STRING ";"; }; constexpr char JniTypeTrait< std::string >::className[]; + template< typename ENV > + inline RCSByteString invoke_ByteString_byteStringValue(JNIEnvWrapper *env, jobject byteStringObj) + { + EXPECT_RET(byteStringObj, "byteStringObj is null!", { }); + + jclass g_cls_RCSByteString = env->FindClassAsGlobalRef(CLS_NAME_RESOURCEBYTESTRING); + + static jfieldID field_data = env->GetFieldID(g_cls_RCSByteString, "mData", "[B"); + static jfieldID field_length = env->GetFieldID(g_cls_RCSByteString, "mSize", "J"); + + jbyteArray jDataInfo = (jbyteArray)env->GetObjectField(byteStringObj, field_data); + jlong jDataLength = env->GetLongField(byteStringObj, field_length); + + jbyte *byteStringData = env->GetByteArrayElements(jDataInfo, NULL); + + RCSByteString byteString((uint8_t *)byteStringData, (size_t)jDataLength); + + env->ReleaseByteArrayElements(jDataInfo, (jbyte*) byteStringData, JNI_ABORT); + env->DeleteGlobalRef(g_cls_RCSByteString); + + return byteString; + } + + template< typename ENV > + inline jobject newRCSByteStringObject(ENV* env, const RCSByteString& value) + { + jsize jSize = (jsize)value.size(); + + jbyteArray jData = env->NewByteArray(jSize); + + std::vector byteString = value.getByteString(); + + env->SetByteArrayRegion(jData, 0, jSize, (const jbyte*)&byteString[0]); + + jclass g_cls_RCSByteString = env->FindClassAsGlobalRef(CLS_NAME_RESOURCEBYTESTRING); + jmethodID g_ctor_RCSByteString = env->GetConstructorID(g_cls_RCSByteString, "([BJ)V"); + + EXPECT_RET(g_ctor_RCSByteString, "g_ctor_RCSByteString is null!", { }); + + jobject jObj = (jobject)env->NewObject(g_cls_RCSByteString, g_ctor_RCSByteString, jData, + (jlong)jSize); + + EXPECT_RET(jObj, "jObj is null!", { }); + + return jObj; + } + + template<> + struct JniTypeTrait< RCSByteString >: public ObjectType + { + static decltype(&invoke_ByteString_byteStringValue) converter; + + static decltype(&newRCSByteStringObject) newObjectFunc; + + static constexpr char className[] = CLS_NAME_RESOURCEBYTESTRING; + }; + constexpr char JniTypeTrait< RCSByteString >::className[]; + decltype(&invoke_ByteString_byteStringValue) JniTypeTrait< RCSByteString >::converter = + &invoke_ByteString_byteStringValue; + + decltype(&newRCSByteStringObject) JniTypeTrait< RCSByteString >::newObjectFunc = + &newRCSByteStringObject; template<> struct JniTypeTrait< RCSResourceAttributes >: public ObjectType @@ -316,6 +379,9 @@ namespace case RCSResourceAttributes::TypeId::STRING: return toNativeValue< std::string >(env, val, depth); + case RCSResourceAttributes::TypeId::BYTESTRING: + return toNativeValue< RCSByteString >(env, val, depth); + case RCSResourceAttributes::TypeId::ATTRIBUTES: return toNativeValue< RCSResourceAttributes >(env, val, depth); } @@ -414,6 +480,11 @@ namespace value.get< typename SeqType< DEPTH, std::string >::type >(), Int2Type< DEPTH >{ }); + case RCSResourceAttributes::TypeId::BYTESTRING: + return createJavaObject(env, + value.get< typename SeqType< DEPTH, RCSByteString >::type >(), + Int2Type< DEPTH > { }); + case RCSResourceAttributes::TypeId::ATTRIBUTES: return createJavaObject(env, value.get< typename SeqType< DEPTH, RCSResourceAttributes >::type >(), @@ -452,6 +523,7 @@ namespace if (env->IsSameObject(g_obj_TypeId_Integer, typeIdObj)) return TypeId::INT; if (env->IsSameObject(g_obj_TypeId_Double, typeIdObj)) return TypeId::DOUBLE; if (env->IsSameObject(g_obj_TypeId_String, typeIdObj)) return TypeId::STRING; + if (env->IsSameObject(g_obj_TypeId_ByteString, typeIdObj)) return TypeId::BYTESTRING; if (env->IsSameObject(g_obj_TypeId_Attributes, typeIdObj)) return TypeId::ATTRIBUTES; if (env->IsSameObject(g_obj_TypeId_Array, typeIdObj)) return TypeId::VECTOR; @@ -494,6 +566,7 @@ void initRCSValue(JNIEnvWrapper* env) g_obj_TypeId_Integer = getTypeIdObj(env, "INTEGER"); g_obj_TypeId_Double = getTypeIdObj(env, "DOUBLE"); g_obj_TypeId_String = getTypeIdObj(env, "STRING"); + g_obj_TypeId_ByteString = getTypeIdObj(env, "BYTESTRING"); g_obj_TypeId_Attributes = getTypeIdObj(env, "ATTRIBUTES"); g_obj_TypeId_Array = getTypeIdObj(env, "ARRAY"); } @@ -509,6 +582,7 @@ void clearRCSValue(JNIEnvWrapper* env) env->DeleteGlobalRef(g_obj_TypeId_Integer); env->DeleteGlobalRef(g_obj_TypeId_Double); env->DeleteGlobalRef(g_obj_TypeId_String); + env->DeleteGlobalRef(g_obj_TypeId_ByteString); env->DeleteGlobalRef(g_obj_TypeId_Attributes); env->DeleteGlobalRef(g_obj_TypeId_Array); }