19class inlineKeyboardButton;
20class pageBlockTableCell;
25extern thread_local bool parse_error;
27extern jclass ArrayKeyboardButtonClass;
28extern jclass ArrayInlineKeyboardButtonClass;
29extern jclass ArrayPageBlockTableCellClass;
30extern jmethodID GetConstructorID;
31extern jmethodID BooleanGetValueMethodID;
32extern jmethodID IntegerGetValueMethodID;
33extern jmethodID LongGetValueMethodID;
34extern jmethodID DoubleGetValueMethodID;
36void set_fatal_error(JNIEnv *env,
const std::string &error);
38jclass get_jclass(JNIEnv *env,
const char *class_name);
40jmethodID get_method_id(JNIEnv *env, jclass clazz,
const char *name,
const char *signature);
42jfieldID get_field_id(JNIEnv *env, jclass clazz,
const char *name,
const char *signature);
44jfieldID get_static_field_id(JNIEnv *env, jclass clazz,
const char *name,
const char *signature);
46void register_native_method(JNIEnv *env, jclass clazz, std::string name, std::string signature,
void *function_ptr);
52 if (java_vm_ !=
nullptr) {
53 java_vm_->DetachCurrentThread();
65 other.java_vm_ =
nullptr;
72 void operator()(JNIEnv *env) {
77std::unique_ptr<JNIEnv, JvmThreadDetacher> get_jni_env(JavaVM *java_vm, jint jni_version);
79std::string fetch_string(JNIEnv *env, jobject o, jfieldID
id);
81std::string fetch_static_string(JNIEnv *env, jclass clazz, jfieldID
id);
83inline jobject fetch_object(JNIEnv *env,
const jobject &o,
const jfieldID &
id) {
85 return env->GetObjectField(o,
id);
88inline bool have_parse_error() {
92inline void reset_parse_error() {
96std::string from_jstring(JNIEnv *env, jstring s);
98jstring to_jstring(JNIEnv *env,
const std::string &s);
100std::string from_bytes(JNIEnv *env, jbyteArray arr);
102jbyteArray to_bytes(JNIEnv *env,
const std::string &b);
104void init_vars(JNIEnv *env,
const char *td_api_java_package);
106jintArray store_vector(JNIEnv *env,
const std::vector<std::int32_t> &v);
108jlongArray store_vector(JNIEnv *env,
const std::vector<std::int64_t> &v);
110jdoubleArray store_vector(JNIEnv *env,
const std::vector<double> &v);
112jobjectArray store_vector(JNIEnv *env,
const std::vector<std::string> &v);
115jobjectArray store_vector(JNIEnv *env,
const std::vector<T> &v) {
116 auto length =
static_cast<jint
>(v.size());
117 T::element_type::init_jni_vars(env);
118 jobjectArray arr = env->NewObjectArray(length, T::element_type::Class, jobject());
119 if (arr !=
nullptr) {
120 for (jint i = 0; i < length; i++) {
121 if (v[i] !=
nullptr) {
122 jobject stored_object;
123 v[i]->store(env, stored_object);
125 env->SetObjectArrayElement(arr, i, stored_object);
126 env->DeleteLocalRef(stored_object);
142 static jclass get() {
143 return ArrayKeyboardButtonClass;
150 static jclass get() {
151 return ArrayInlineKeyboardButtonClass;
158 static jclass get() {
159 return ArrayPageBlockTableCellClass;
164jobjectArray store_vector(JNIEnv *env,
const std::vector<std::vector<T>> &v) {
165 auto length =
static_cast<jint
>(v.size());
167 if (arr !=
nullptr) {
168 for (jint i = 0; i < length; i++) {
169 auto stored_array = store_vector(env, v[i]);
171 env->SetObjectArrayElement(arr, i, stored_array);
172 env->DeleteLocalRef(stored_array);
180auto fetch_tl_object(JNIEnv *env, jobject obj) {
181 decltype(T::fetch(env, obj)) result;
182 if (obj !=
nullptr) {
183 result = T::fetch(env, obj);
184 env->DeleteLocalRef(obj);
189std::vector<std::int32_t> fetch_vector(JNIEnv *env, jintArray arr);
191std::vector<std::int64_t> fetch_vector(JNIEnv *env, jlongArray arr);
193std::vector<double> fetch_vector(JNIEnv *env, jdoubleArray arr);
197 static auto fetch(JNIEnv *env, jobjectArray arr) {
198 std::vector<decltype(fetch_tl_object<T>(env, jobject()))> result;
199 if (arr !=
nullptr) {
200 jsize length = env->GetArrayLength(arr);
201 result.reserve(length);
202 for (jsize i = 0; i < length; i++) {
203 result.push_back(fetch_tl_object<T>(env, env->GetObjectArrayElement(arr, i)));
205 env->DeleteLocalRef(arr);
213 static std::vector<std::string> fetch(JNIEnv *env, jobjectArray arr) {
214 std::vector<std::string> result;
215 if (arr !=
nullptr) {
216 jsize length = env->GetArrayLength(arr);
217 result.reserve(length);
218 for (jsize i = 0; i < length; i++) {
219 jstring str = (jstring)env->GetObjectArrayElement(arr, i);
220 result.push_back(from_jstring(env, str));
222 env->DeleteLocalRef(str);
225 env->DeleteLocalRef(arr);
233 static std::vector<std::string> fetch(JNIEnv *env, jobjectArray arr) {
234 std::vector<std::string> result;
235 if (arr !=
nullptr) {
236 jsize length = env->GetArrayLength(arr);
237 result.reserve(length);
238 for (jsize i = 0; i < length; i++) {
239 jbyteArray bytes = (jbyteArray)env->GetObjectArrayElement(arr, i);
240 result.push_back(from_bytes(env, bytes));
242 env->DeleteLocalRef(bytes);
245 env->DeleteLocalRef(arr);
253 static auto fetch(JNIEnv *env, jobjectArray arr) {
255 if (arr !=
nullptr) {
256 jsize length = env->GetArrayLength(arr);
257 result.reserve(length);
258 for (jsize i = 0; i < length; i++) {
261 env->DeleteLocalRef(arr);