+ 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<uint8_t> 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<JNIEnvWrapper>) converter;
+
+ static decltype(&newRCSByteStringObject<JNIEnvWrapper>) newObjectFunc;
+
+ static constexpr char className[] = CLS_NAME_RESOURCEBYTESTRING;
+ };
+ constexpr char JniTypeTrait< RCSByteString >::className[];
+ decltype(&invoke_ByteString_byteStringValue<JNIEnvWrapper>) JniTypeTrait< RCSByteString >::converter =
+ &invoke_ByteString_byteStringValue<JNIEnvWrapper>;
+
+ decltype(&newRCSByteStringObject<JNIEnvWrapper>) JniTypeTrait< RCSByteString >::newObjectFunc =
+ &newRCSByteStringObject<JNIEnvWrapper>;