Add support for fetching vector<bytes> in JNI interface.
GitOrigin-RevId: a7e4a44cb20262b9268a981ebed139e21794d525
This commit is contained in:
parent
5f5d3355e3
commit
bc49ef8330
@ -94,12 +94,12 @@ std::string TD_TL_writer_jni_cpp::gen_vector_fetch(std::string field_name, const
|
||||
}
|
||||
|
||||
if (!array_type.empty()) {
|
||||
return "jni::fetch_vector(env, (" + array_type + ")" + fetch_object + ");";
|
||||
return "jni::fetch_vector(env, (" + array_type + ")" + fetch_object + ")";
|
||||
}
|
||||
|
||||
std::string template_type;
|
||||
if (vector_type == "string") {
|
||||
template_type = "std::string";
|
||||
template_type = "string";
|
||||
} else if (vector_type.compare(0, 11, "std::vector") == 0) {
|
||||
const tl::tl_tree_type *child = static_cast<const tl::tl_tree_type *>(t->children[0]);
|
||||
template_type = gen_type_name(child);
|
||||
@ -108,13 +108,12 @@ std::string TD_TL_writer_jni_cpp::gen_vector_fetch(std::string field_name, const
|
||||
}
|
||||
template_type = "std::vector<" + template_type + ">";
|
||||
} else if (vector_type == "bytes") {
|
||||
std::fprintf(stderr, "Vector of Bytes is not supported\n");
|
||||
assert(false);
|
||||
template_type = "jbyteArray";
|
||||
} else {
|
||||
assert(vector_type.compare(0, 10, "object_ptr") == 0);
|
||||
template_type = gen_main_class_name(t->type);
|
||||
}
|
||||
return "jni::FetchVector<" + template_type + ">::fetch(env, (jobjectArray)" + fetch_object + ");";
|
||||
return "jni::FetchVector<" + template_type + ">::fetch(env, (jobjectArray)" + fetch_object + ")";
|
||||
}
|
||||
|
||||
std::string TD_TL_writer_jni_cpp::gen_type_fetch(const std::string &field_name, const tl::tl_tree_type *tree_type,
|
||||
@ -179,7 +178,7 @@ std::string TD_TL_writer_jni_cpp::gen_type_fetch(const std::string &field_name,
|
||||
return gen_main_class_name(tree_type->type) + "::fetch(env, p)";
|
||||
}
|
||||
res = "jni::fetch_tl_object<" + gen_main_class_name(tree_type->type) + ">(env, jni::fetch_object(env, p, " +
|
||||
field_name + "fieldID));";
|
||||
field_name + "fieldID))";
|
||||
}
|
||||
return res_begin + res;
|
||||
}
|
||||
|
@ -210,7 +210,7 @@ struct FetchVector<std::string> {
|
||||
result.reserve(length);
|
||||
for (jsize i = 0; i < length; i++) {
|
||||
jstring str = (jstring)env->GetObjectArrayElement(arr, i);
|
||||
result.push_back(jni::from_jstring(env, str));
|
||||
result.push_back(from_jstring(env, str));
|
||||
if (str) {
|
||||
env->DeleteLocalRef(str);
|
||||
}
|
||||
@ -221,6 +221,26 @@ struct FetchVector<std::string> {
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct FetchVector<jbyteArray> {
|
||||
static std::vector<std::string> fetch(JNIEnv *env, jobjectArray arr) {
|
||||
std::vector<std::string> result;
|
||||
if (arr != nullptr) {
|
||||
jsize length = env->GetArrayLength(arr);
|
||||
result.reserve(length);
|
||||
for (jsize i = 0; i < length; i++) {
|
||||
jbyteArray bytes = (jbyteArray)env->GetObjectArrayElement(arr, i);
|
||||
result.push_back(from_bytes(env, bytes));
|
||||
if (bytes) {
|
||||
env->DeleteLocalRef(bytes);
|
||||
}
|
||||
}
|
||||
env->DeleteLocalRef(arr);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
template <class T>
|
||||
struct FetchVector<std::vector<T>> {
|
||||
static auto fetch(JNIEnv *env, jobjectArray arr) {
|
||||
|
Reference in New Issue
Block a user