diff --git a/example/java/td_jni.cpp b/example/java/td_jni.cpp index 02396dbb1..fb7554c74 100644 --- a/example/java/td_jni.cpp +++ b/example/java/td_jni.cpp @@ -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; } diff --git a/td/generate/DoxygenTlDocumentationGenerator.php b/td/generate/DoxygenTlDocumentationGenerator.php index 2d5a37b2c..b9fca60f4 100644 --- a/td/generate/DoxygenTlDocumentationGenerator.php +++ b/td/generate/DoxygenTlDocumentationGenerator.php @@ -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) diff --git a/td/generate/tl_writer_jni_cpp.cpp b/td/generate/tl_writer_jni_cpp.cpp index 96c872cc3..59331aab3 100644 --- a/td/generate/tl_writer_jni_cpp.cpp +++ b/td/generate/tl_writer_jni_cpp.cpp @@ -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, diff --git a/td/generate/tl_writer_jni_cpp.h b/td/generate/tl_writer_jni_cpp.h index fd2b6976d..7ceda54b9 100644 --- a/td/generate/tl_writer_jni_cpp.h +++ b/td/generate/tl_writer_jni_cpp.h @@ -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 &vars, int parser_type) const; std::string gen_vector_store(const std::string &field_name, const tl::tl_tree_type *t, const std::vector &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; diff --git a/td/generate/tl_writer_jni_h.cpp b/td/generate/tl_writer_jni_h.cpp index 4be1e38d5..095cfed52 100644 --- a/td/generate/tl_writer_jni_h.cpp +++ b/td/generate/tl_writer_jni_h.cpp @@ -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); diff --git a/td/tl/tl_jni_object.h b/td/tl/tl_jni_object.h index 48faee4d3..8e2dcd845 100644 --- a/td/tl/tl_jni_object.h +++ b/td/tl/tl_jni_object.h @@ -108,6 +108,7 @@ jobjectArray store_vector(JNIEnv *env, const std::vector &v); template jobjectArray store_vector(JNIEnv *env, const std::vector &v) { auto length = static_cast(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++) {