Use lazy initialization for Java class identifiers to avoid global reference table overflow on some Android 4 devices.
This commit is contained in:
parent
c62de5138c
commit
36a45607f2
@ -168,8 +168,7 @@ static jint register_native(JavaVM *vm) {
|
||||
#undef TD_OBJECT
|
||||
|
||||
td::jni::init_vars(env, PACKAGE_NAME);
|
||||
td::td_api::Object::init_jni_vars(env, PACKAGE_NAME);
|
||||
td::td_api::Function::init_jni_vars(env, PACKAGE_NAME);
|
||||
td::td_api::set_package_name(PACKAGE_NAME);
|
||||
|
||||
return JAVA_VERSION;
|
||||
}
|
||||
|
@ -129,7 +129,8 @@ class DoxygenTlDocumentationGenerator extends TlDocumentationGenerator
|
||||
preg_match('/class [A-Za-z0-9_]*;/', $line) || $tline === 'if (value == nullptr) {' ||
|
||||
strpos($tline, 'result += ') === 0 || strpos($tline, 'result = ') || strpos($tline, ' : values') ||
|
||||
strpos($line, 'JNIEnv') || strpos($line, 'jfieldID') || $tline === 'virtual ~Object() {' ||
|
||||
$tline === 'virtual void store(TlStorerToString &s, const char *field_name) const = 0;';
|
||||
$tline === 'virtual void store(TlStorerToString &s, const char *field_name) const = 0;' ||
|
||||
$tline === 'void set_package_name(const char *new_package_name);';
|
||||
}
|
||||
|
||||
protected function isHeaderLine($line)
|
||||
|
@ -11,6 +11,14 @@
|
||||
|
||||
namespace td {
|
||||
|
||||
std::string TD_TL_writer_jni_cpp::gen_output_begin() const {
|
||||
return TD_TL_writer_cpp::gen_output_begin() +
|
||||
"\nstatic const char *package_name = \"Call set_package_name\";\n\n"
|
||||
"void set_package_name(const char *new_package_name) {\n"
|
||||
" package_name = new_package_name;\n"
|
||||
"}\n";
|
||||
}
|
||||
|
||||
bool TD_TL_writer_jni_cpp::is_built_in_simple_type(const std::string &name) const {
|
||||
return name == "Bool" || name == "Int32" || name == "Int53" || name == "Int64" || name == "Double" ||
|
||||
name == "String" || name == "Bytes";
|
||||
@ -397,7 +405,10 @@ std::string TD_TL_writer_jni_cpp::gen_fetch_function_begin(const std::string &pa
|
||||
if (field_count == 0 && vars.empty()) {
|
||||
result += " return make_object<" + class_name + ">();\n";
|
||||
} else {
|
||||
result += " " + fetched_type + "res = make_object<" + class_name + ">();\n";
|
||||
result +=
|
||||
" init_jni_vars(env);\n"
|
||||
" " +
|
||||
fetched_type + "res = make_object<" + class_name + ">();\n";
|
||||
}
|
||||
}
|
||||
return result;
|
||||
@ -462,7 +473,8 @@ std::string TD_TL_writer_jni_cpp::gen_store_function_begin(const std::string &st
|
||||
"void " +
|
||||
class_name + "::store(" + storer_name + " &s" +
|
||||
std::string(storer_type <= 0 ? "" : ", const char *field_name") + ") const {\n" +
|
||||
(storer_type <= 0 ? " s = env->AllocObject(Class);\n"
|
||||
(storer_type <= 0 ? " init_jni_vars(env);\n"
|
||||
" s = env->AllocObject(Class);\n"
|
||||
" if (!s) { return; }\n"
|
||||
: " if (!LOG_IS_STRIPPED(ERROR)) {\n"
|
||||
" s.store_class_begin(field_name, \"" +
|
||||
@ -566,8 +578,9 @@ std::string TD_TL_writer_jni_cpp::gen_additional_function(const std::string &fun
|
||||
"\n"
|
||||
"void " +
|
||||
class_name + "::" + function_name +
|
||||
"(JNIEnv *env, const char *package_name) {\n"
|
||||
" " +
|
||||
"(JNIEnv *env) {\n"
|
||||
" static bool is_inited = [&] {\n"
|
||||
" " +
|
||||
class_name_class + " = jni::get_jclass(env, " + gen_java_class_name(gen_class_name(t->name)) + ");\n";
|
||||
|
||||
if (!t->args.empty()) {
|
||||
@ -596,11 +609,14 @@ std::string TD_TL_writer_jni_cpp::gen_additional_function(const std::string &fun
|
||||
}
|
||||
type_signature = new_type_signature + ").c_str()";
|
||||
}
|
||||
res += " " + field_name + "fieldID = jni::get_field_id(env, " + class_name_class + ", \"" + java_field_name +
|
||||
res += " " + field_name + "fieldID = jni::get_field_id(env, " + class_name_class + ", \"" + java_field_name +
|
||||
"\", " + type_signature + ");\n";
|
||||
}
|
||||
}
|
||||
res += "}\n";
|
||||
res +=
|
||||
" return true;\n"
|
||||
" }();\n"
|
||||
"}\n";
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -613,7 +629,7 @@ std::string TD_TL_writer_jni_cpp::gen_additional_proxy_function_begin(const std:
|
||||
return "\n"
|
||||
"void " +
|
||||
class_name + "::" + function_name +
|
||||
"(JNIEnv *env, const char *package_name) {\n"
|
||||
"(JNIEnv *env) {\n"
|
||||
" Class = jni::get_jclass(env, " +
|
||||
gen_java_class_name(class_name) + ");\n";
|
||||
}
|
||||
@ -623,7 +639,7 @@ std::string TD_TL_writer_jni_cpp::gen_additional_proxy_function_case(const std::
|
||||
const std::string &class_name, int arity) const {
|
||||
assert(function_name == "init_jni_vars");
|
||||
assert(arity == 0);
|
||||
return " " + class_name + "::" + function_name + "(env, package_name);\n";
|
||||
return "";
|
||||
}
|
||||
|
||||
std::string TD_TL_writer_jni_cpp::gen_additional_proxy_function_case(const std::string &function_name,
|
||||
@ -632,7 +648,7 @@ std::string TD_TL_writer_jni_cpp::gen_additional_proxy_function_case(const std::
|
||||
bool is_function) const {
|
||||
assert(function_name == "init_jni_vars");
|
||||
assert(arity == 0);
|
||||
return " " + gen_class_name(t->name) + "::" + function_name + "(env, package_name);\n";
|
||||
return "";
|
||||
}
|
||||
|
||||
std::string TD_TL_writer_jni_cpp::gen_additional_proxy_function_end(const std::string &function_name,
|
||||
|
@ -16,14 +16,14 @@
|
||||
namespace td {
|
||||
|
||||
class TD_TL_writer_jni_cpp final : public TD_TL_writer_cpp {
|
||||
std::string gen_output_begin() const final;
|
||||
|
||||
std::string gen_vector_fetch(std::string field_name, const tl::tl_tree_type *t,
|
||||
const std::vector<tl::var_description> &vars, int parser_type) const;
|
||||
|
||||
std::string gen_vector_store(const std::string &field_name, const tl::tl_tree_type *t,
|
||||
const std::vector<tl::var_description> &vars, int storer_type) const;
|
||||
|
||||
std::string package_name;
|
||||
|
||||
std::string gen_java_field_name(std::string name) const;
|
||||
|
||||
std::string gen_basic_java_class_name(std::string name) const;
|
||||
|
@ -122,7 +122,9 @@ std::string TD_TL_writer_jni_h::gen_output_begin() const {
|
||||
" }\n"
|
||||
"\n"
|
||||
" return to_string(*value);\n"
|
||||
"}\n\n";
|
||||
"}\n\n"
|
||||
|
||||
"void set_package_name(const char *new_package_name);\n\n";
|
||||
}
|
||||
|
||||
std::string TD_TL_writer_jni_h::gen_class_begin(const std::string &class_name, const std::string &base_class_name,
|
||||
@ -157,7 +159,7 @@ std::string TD_TL_writer_jni_h::gen_additional_function(const std::string &funct
|
||||
if (function_name == "init_jni_vars") {
|
||||
return "\n"
|
||||
" static void " +
|
||||
function_name + "(JNIEnv *env, const char *package_name);\n";
|
||||
function_name + "(JNIEnv *env);\n";
|
||||
}
|
||||
|
||||
return TD_TL_writer_h::gen_additional_function(function_name, t, is_function);
|
||||
@ -170,7 +172,7 @@ std::string TD_TL_writer_jni_h::gen_additional_proxy_function_begin(const std::s
|
||||
if (function_name == "init_jni_vars") {
|
||||
return "\n"
|
||||
" static void " +
|
||||
function_name + "(JNIEnv *env, const char *package_name);\n";
|
||||
function_name + "(JNIEnv *env);\n";
|
||||
}
|
||||
|
||||
return TD_TL_writer_h::gen_additional_proxy_function_begin(function_name, type, class_name, arity, is_function);
|
||||
|
@ -108,6 +108,7 @@ jobjectArray store_vector(JNIEnv *env, const std::vector<std::string> &v);
|
||||
template <class T>
|
||||
jobjectArray store_vector(JNIEnv *env, const std::vector<T> &v) {
|
||||
auto length = static_cast<jint>(v.size());
|
||||
T::element_type::init_jni_vars(env);
|
||||
jobjectArray arr = env->NewObjectArray(length, T::element_type::Class, jobject());
|
||||
if (arr != nullptr) {
|
||||
for (jint i = 0; i < length; i++) {
|
||||
|
Loading…
Reference in New Issue
Block a user