15 #if defined(ANDROID) || defined(__ANDROID__)
24 static JavaVM *android_jvm = NULL;
25 static jobject android_connectivity_manager = NULL;
28 static jmethodID android_cm_active_net_mid = NULL;
30 static jmethodID android_cm_link_props_mid = NULL;
32 static jmethodID android_lp_dns_servers_mid = NULL;
34 static jmethodID android_lp_domains_mid = NULL;
36 static jmethodID android_list_size_mid = NULL;
38 static jmethodID android_list_get_mid = NULL;
40 static jmethodID android_ia_host_addr_mid = NULL;
42 static jclass jni_get_class(JNIEnv *
env,
const char *
path)
49 cls = (*env)->FindClass(
env,
path);
50 if ((*env)->ExceptionOccurred(
env)) {
51 (*env)->ExceptionClear(
env);
57 static jmethodID jni_get_method_id(JNIEnv *
env, jclass cls,
58 const char *func_name,
const char *signature)
62 if (
env == NULL || cls == NULL || func_name == NULL || *func_name ==
'\0' ||
63 signature == NULL || *signature ==
'\0')
68 mid = (*env)->GetMethodID(
env, cls, func_name, signature);
69 if ((*env)->ExceptionOccurred(
env))
71 (*env)->ExceptionClear(
env);
78 void ares_library_init_jvm(JavaVM *jvm)
83 int ares_library_init_android(jobject connectivity_manager)
89 jclass obj_cls = NULL;
91 if (android_jvm == NULL)
94 res = (*android_jvm)->GetEnv(android_jvm, (
void **)&
env, JNI_VERSION_1_6);
95 if (res == JNI_EDETACHED)
98 res = (*android_jvm)->AttachCurrentThread(android_jvm, &
env, NULL);
101 if (res != JNI_OK ||
env == NULL)
104 android_connectivity_manager =
105 (*env)->NewGlobalRef(
env, connectivity_manager);
106 if (android_connectivity_manager == NULL)
114 obj_cls = jni_get_class(
env,
"android/net/ConnectivityManager");
119 android_cm_active_net_mid =
120 jni_get_method_id(
env, obj_cls,
"getActiveNetwork",
121 "()Landroid/net/Network;");
122 if (android_cm_active_net_mid == NULL)
126 android_cm_link_props_mid =
127 jni_get_method_id(
env, obj_cls,
"getLinkProperties",
128 "(Landroid/net/Network;)Landroid/net/LinkProperties;");
129 if (android_cm_link_props_mid == NULL)
133 (*env)->DeleteLocalRef(
env, obj_cls);
134 obj_cls = jni_get_class(
env,
"android/net/LinkProperties");
139 android_lp_dns_servers_mid = jni_get_method_id(
env, obj_cls,
"getDnsServers",
140 "()Ljava/util/List;");
141 if (android_lp_dns_servers_mid == NULL)
145 android_lp_domains_mid = jni_get_method_id(
env, obj_cls,
"getDomains",
146 "()Ljava/lang/String;");
147 if (android_lp_domains_mid == NULL)
150 (*env)->DeleteLocalRef(
env, obj_cls);
151 obj_cls = jni_get_class(
env,
"java/util/List");
155 android_list_size_mid = jni_get_method_id(
env, obj_cls,
"size",
"()I");
156 if (android_list_size_mid == NULL)
159 android_list_get_mid = jni_get_method_id(
env, obj_cls,
"get",
160 "(I)Ljava/lang/Object;");
161 if (android_list_get_mid == NULL)
164 (*env)->DeleteLocalRef(
env, obj_cls);
165 obj_cls = jni_get_class(
env,
"java/net/InetAddress");
169 android_ia_host_addr_mid = jni_get_method_id(
env, obj_cls,
"getHostAddress",
170 "()Ljava/lang/String;");
171 if (android_ia_host_addr_mid == NULL)
174 (*env)->DeleteLocalRef(
env, obj_cls);
179 (*env)->DeleteLocalRef(
env, obj_cls);
181 android_cm_active_net_mid = NULL;
182 android_cm_link_props_mid = NULL;
183 android_lp_dns_servers_mid = NULL;
184 android_lp_domains_mid = NULL;
185 android_list_size_mid = NULL;
186 android_list_get_mid = NULL;
187 android_ia_host_addr_mid = NULL;
191 (*android_jvm)->DetachCurrentThread(android_jvm);
196 int ares_library_android_initialized(
void)
198 if (android_jvm == NULL || android_connectivity_manager == NULL)
203 void ares_library_cleanup_android(
void)
206 int need_detatch = 0;
209 if (android_jvm == NULL || android_connectivity_manager == NULL)
212 res = (*android_jvm)->GetEnv(android_jvm, (
void **)&
env, JNI_VERSION_1_6);
213 if (res == JNI_EDETACHED)
216 res = (*android_jvm)->AttachCurrentThread(android_jvm, &
env, NULL);
219 if (res != JNI_OK ||
env == NULL)
222 android_cm_active_net_mid = NULL;
223 android_cm_link_props_mid = NULL;
224 android_lp_dns_servers_mid = NULL;
225 android_lp_domains_mid = NULL;
226 android_list_size_mid = NULL;
227 android_list_get_mid = NULL;
228 android_ia_host_addr_mid = NULL;
230 (*env)->DeleteGlobalRef(
env, android_connectivity_manager);
231 android_connectivity_manager = NULL;
234 (*android_jvm)->DetachCurrentThread(android_jvm);
237 char **ares_get_android_server_list(
size_t max_servers,
241 jobject active_network = NULL;
242 jobject link_properties = NULL;
243 jobject server_list = NULL;
247 const char *ch_server_address;
250 char **dns_list = NULL;
251 int need_detatch = 0;
253 if (android_jvm == NULL || android_connectivity_manager == NULL ||
254 max_servers == 0 || num_servers == NULL)
259 if (android_cm_active_net_mid == NULL || android_cm_link_props_mid == NULL ||
260 android_lp_dns_servers_mid == NULL || android_list_size_mid == NULL ||
261 android_list_get_mid == NULL || android_ia_host_addr_mid == NULL)
266 res = (*android_jvm)->GetEnv(android_jvm, (
void **)&
env, JNI_VERSION_1_6);
267 if (res == JNI_EDETACHED)
270 res = (*android_jvm)->AttachCurrentThread(android_jvm, &
env, NULL);
273 if (res != JNI_OK ||
env == NULL)
297 active_network = (*env)->CallObjectMethod(
env, android_connectivity_manager,
298 android_cm_active_net_mid);
299 if (active_network == NULL)
303 (*env)->CallObjectMethod(
env, android_connectivity_manager,
304 android_cm_link_props_mid, active_network);
305 if (link_properties == NULL)
308 server_list = (*env)->CallObjectMethod(
env, link_properties,
309 android_lp_dns_servers_mid);
310 if (server_list == NULL)
313 nserv = (*env)->CallIntMethod(
env, server_list, android_list_size_mid);
314 if (nserv > (jint)max_servers)
315 nserv = (jint)max_servers;
318 *num_servers = (size_t)nserv;
320 dns_list =
ares_malloc(
sizeof(*dns_list)*(*num_servers));
321 for (
i=0;
i<*num_servers;
i++)
323 server = (*env)->CallObjectMethod(
env, server_list, android_list_get_mid,
331 str = (*env)->CallObjectMethod(
env,
server, android_ia_host_addr_mid);
332 ch_server_address = (*env)->GetStringUTFChars(
env,
str, 0);
333 strncpy(dns_list[
i], ch_server_address, 64);
334 (*env)->ReleaseStringUTFChars(
env,
str, ch_server_address);
335 (*env)->DeleteLocalRef(
env,
str);
340 if ((*env)->ExceptionOccurred(
env))
341 (*env)->ExceptionClear(
env);
343 if (server_list != NULL)
344 (*env)->DeleteLocalRef(
env, server_list);
345 if (link_properties != NULL)
346 (*env)->DeleteLocalRef(
env, link_properties);
347 if (active_network != NULL)
348 (*env)->DeleteLocalRef(
env, active_network);
351 (*android_jvm)->DetachCurrentThread(android_jvm);
355 char *ares_get_android_search_domains_list(
void)
358 jobject active_network = NULL;
359 jobject link_properties = NULL;
363 char *domain_list = NULL;
364 int need_detatch = 0;
366 if (android_jvm == NULL || android_connectivity_manager == NULL)
371 if (android_cm_active_net_mid == NULL || android_cm_link_props_mid == NULL ||
372 android_lp_domains_mid == NULL)
377 res = (*android_jvm)->GetEnv(android_jvm, (
void **)&
env, JNI_VERSION_1_6);
378 if (res == JNI_EDETACHED)
381 res = (*android_jvm)->AttachCurrentThread(android_jvm, &
env, NULL);
384 if (res != JNI_OK ||
env == NULL)
405 active_network = (*env)->CallObjectMethod(
env, android_connectivity_manager,
406 android_cm_active_net_mid);
407 if (active_network == NULL)
411 (*env)->CallObjectMethod(
env, android_connectivity_manager,
412 android_cm_link_props_mid, active_network);
413 if (link_properties == NULL)
417 domains = (*env)->CallObjectMethod(
env, link_properties,
418 android_lp_domains_mid);
423 domain = (*env)->GetStringUTFChars(
env,
domains, 0);
425 (*env)->ReleaseStringUTFChars(
env,
domains, domain);
429 if ((*env)->ExceptionOccurred(
env))
430 (*env)->ExceptionClear(
env);
432 if (link_properties != NULL)
433 (*env)->DeleteLocalRef(
env, link_properties);
434 if (active_network != NULL)
435 (*env)->DeleteLocalRef(
env, active_network);
438 (*android_jvm)->DetachCurrentThread(android_jvm);