Vectors are now exposed as ArrayList<T> in the Java backend even for arguments
and return values to/from methods, they already were inside structures.
In addition vectors of arrays are now properly marshalled when used as arguments
or results to/from methods.
Bug: 32237331, 32180328
Test: hidl_test_java
Change-Id: Ie24f11668f22fc2c31fb7d8e8da534f1c970f58f
diff --git a/VectorType.cpp b/VectorType.cpp
index f656281..d7eb581 100644
--- a/VectorType.cpp
+++ b/VectorType.cpp
@@ -59,10 +59,18 @@
std::string VectorType::getJavaType(
std::string *extra, bool /* forInitializer */) const {
- *extra = "[]";
+ extra->clear();
std::string elementExtra;
- return mElementType->getJavaType(&elementExtra) + elementExtra;
+ std::string elementJavaType = mElementType->getJavaType(&elementExtra);
+
+ CHECK(mElementType->isArray() || elementExtra.empty());
+
+ return "ArrayList<"
+ + (mElementType->isArray()
+ ? elementJavaType : mElementType->getJavaWrapperType())
+ + elementExtra
+ + ">";
}
std::string VectorType::getVtsType() const {
@@ -341,6 +349,50 @@
return;
}
+ if (mElementType->isArray()) {
+ if (isReader) {
+ std::string extra;
+ out << " new "
+ << getJavaType(&extra, false /* forInitializer */)
+ << "();\n";
+ }
+
+ out << "{\n";
+ out.indent();
+
+ out << "HwBlob _hidl_blob = ";
+
+ if (isReader) {
+ out << parcelObj
+ << ".readBuffer();\n";
+ } else {
+ size_t align, size;
+ getAlignmentAndSize(&align, &size);
+
+ out << "new HwBlob("
+ << size
+ << " /* size */);\n";
+ }
+
+ emitJavaFieldReaderWriter(
+ out,
+ 0 /* depth */,
+ parcelObj,
+ "_hidl_blob",
+ argName,
+ "0 /* offset */",
+ isReader);
+
+ if (!isReader) {
+ out << parcelObj << ".writeBuffer(_hidl_blob);\n";
+ };
+
+ out.unindent();
+ out << "}\n";
+
+ return;
+ }
+
emitJavaReaderWriterWithSuffix(
out,
parcelObj,
@@ -353,19 +405,15 @@
void VectorType::emitJavaFieldInitializer(
Formatter &out, const std::string &fieldName) const {
std::string extra;
- mElementType->getJavaType(&extra);
+ std::string javaType = getJavaType(&extra, false /* forInitializer */);
- const std::string wrapperType = mElementType->getJavaWrapperType();
-
- out << "final ArrayList<"
- << wrapperType
- << extra
- << "> "
+ out << "final "
+ << javaType
+ << " "
<< fieldName
- << " = new ArrayList<"
- << wrapperType
- << extra
- << ">();\n";
+ << " = new "
+ << javaType
+ << "();\n";
}
void VectorType::emitJavaFieldReaderWriter(
@@ -450,16 +498,8 @@
iteratorName + " * " + std::to_string(elementSize),
true /* isReader */);
- out << fieldName;
-
- if (elementType->isArray()
- && static_cast<const ArrayType *>(
- elementType)->getElementType()->resolveToScalarType()
- != nullptr) {
- out << ".add(HwBlob.wrapArray(_hidl_vec_element));\n";
- } else {
- out << ".add(_hidl_vec_element);\n";
- }
+ out << fieldName
+ << ".add(_hidl_vec_element);\n";
out.unindent();
@@ -577,6 +617,10 @@
return static_cast<ArrayType *>(mElementType)->countDimensions() == 1;
}
+ if (mElementType->isVector()) {
+ return false;
+ }
+
return true;
}