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);