#ifndef JNI_UTILS_H
#define JNI_UTILS_H
#include <jni.h>
#include <android/log.h>
static const char* kTAG = "blurdroid";
#define LOGI(...) \
((void)__android_log_print (ANDROID_LOG_INFO, kTAG, __VA_ARGS__))
#define LOGW(...) \
((void)__android_log_print (ANDROID_LOG_WARN, kTAG, __VA_ARGS__))
#define LOGE(...) \
((void)__android_log_print (ANDROID_LOG_ERROR, kTAG, __VA_ARGS__))
typedef struct {
JavaVM *javaVM;
jclass adapter_cls;
jmethodID adapter_get_adapter;
jmethodID adapter_get_address;
jmethodID adapter_get_name;
jmethodID adapter_get_devices;
jmethodID adapter_get_devices_size;
jmethodID adapter_get_remote_device;
jmethodID adapter_start_le_scan;
jmethodID adapter_stop_le_scan;
jclass device_cls;
jmethodID device_get_address;
jmethodID device_get_name;
jmethodID device_get_uuids;
jmethodID device_get_uuids_size;
jmethodID device_get_rssi;
jmethodID device_get_tx_power;
jmethodID device_get_manufacturer_data_keys;
jmethodID device_get_manufacturer_data_keys_size;
jmethodID device_get_manufacturer_data_values;
jmethodID device_get_manufacturer_data_values_size;
jmethodID device_get_service_data_keys;
jmethodID device_get_service_data_keys_size;
jmethodID device_get_service_data_values;
jmethodID device_get_service_data_values_size;
jmethodID device_connect_gatt;
jmethodID device_disconnect;
jmethodID device_is_connected;
jmethodID device_get_gatt;
jclass gatt_cls;
jmethodID gatt_get_gatt_services;
jmethodID gatt_get_gatt_service;
jmethodID gatt_get_gatt_services_size;
jclass service_cls;
jmethodID service_get_id;
jmethodID service_get_uuid;
jmethodID service_is_primary;
jmethodID service_get_gatt_characteristics;
jmethodID service_get_gatt_characteristic;
jmethodID service_get_gatt_characteristics_size;
jclass characteristic_cls;
jmethodID characteristic_get_id;
jmethodID characteristic_get_uuid;
jmethodID characteristic_get_flags;
jmethodID characteristic_get_flags_size;
jmethodID characteristic_get_gatt_descriptors;
jmethodID characteristic_get_gatt_descriptor;
jmethodID characteristic_get_gatt_descriptors_size;
jmethodID characteristic_get_value;
jmethodID characteristic_get_value_size;
jmethodID characteristic_read_value;
jmethodID characteristic_write_value;
jmethodID characteristic_start_notify;
jmethodID characteristic_stop_notify;
jclass descriptor_cls;
jmethodID descriptor_get_id;
jmethodID descriptor_get_uuid;
jmethodID descriptor_get_value;
jmethodID descriptor_get_value_size;
jmethodID descriptor_read_value;
jmethodID descriptor_write_value;
jclass set_cls;
jmethodID set_iterator;
jmethodID set_size;
jclass iterator_cls;
jmethodID iterator_has_next;
jmethodID iterator_next;
jmethodID null;
} BTContext;
BTContext g_ctx;
jobject jni_create_static_object (jclass, jmethodID);
jobject jni_create_object (jobject, jmethodID);
jobject jni_create_object_int (jobject, jmethodID, int);
jobject jni_create_object_str (jobject, jmethodID, const char*, int);
void jni_delete_object (jobject);
jobject jni_call_object (jobject, jmethodID);
int jni_call_bool (jobject, jmethodID);
int jni_call_int (jobject, jmethodID);
int jni_call_int2 (jobject, jmethodID, int);
int jni_call_int3 (jobject, jmethodID, const char*, int);
int jni_set_value(jobject, jmethodID, const int*, int);
const int* jni_get_value(jobject, jmethodID, int);
const int* jni_get_value2(jobject, jmethodID, const char*, int);
const int* jni_call_int_array (jobject, jmethodID, jmethodID);
const char* jni_call_str (jobject, jmethodID);
const char** jni_call_str_array (jobject, jmethodID, jmethodID);
#endif