Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
ARES_LIBR...IT_ANDROID(3)  Library Functions Manual  ARES_LIBR...IT_ANDROID(3)

NAME
       ares_library_init_android - c-ares library Android initialization

SYNOPSIS
       #include	<ares.h>

       int ares_library_init_android(jobject connectivity_manager)

       int ares_library_android_initialized();

       void ares_library_init_jvm(JavaVM *jvm)

DESCRIPTION
       The  ares_library_init_android(3) function performs initializations in-
       ternally	required by the	c-ares library when used on Android. This  can
       take place anytime after	ares_library_init(3). It must take place after
       ares_library_init_jvm.  ares_library_init_android must be called	before
       DNS resolution will work	on Android 8 (Oreo) or	newer  when  targetSd-
       kVersion	is set to 26+.

       As  of  Android 8 (API level 26)	getting	DNS server information has be-
       comei more restrictive and can only be accessed using the  Connectivity
       Manager.	It is necessary	to pass	the connectivity manager to c-ares via
       JNI.  Also,  the	ACCESS_NETWORK_STATE permission	must be	present	in the
       Android application.

       Android older than 8 do not need	to to be initialized as	they are  less
       restrictive.  However,  this is a run time not compile time limitation.
       Proper Android initialization should take place regardless of the  tar-
       geted Android version.

       Deinitialization	will take place	though ares_library_cleanup(3).

       The  ares_library_init_jvm  function  allows the	caller to register the
       JVM with	c-ares.	 It's meant to be  called  during  JNI_OnLoad  because
       you're guaranteed to have the JVM in that function. The JVM is required
       in  order  to  use  the	Connectivity Manager registered	using ares_li-
       brary_init_android(3). This must	be call	 before	 ares_library_init_an-
       droid(3).

       The  ares_library_android_initialized  function	can  be	 used to check
       whether c-ares has been initialized for use with	Android.

RETURN VALUES
       ARES_SUCCESS will be returned on	success	otherwise an error  code  will
       be returned.

THREAD SAFETY
       These init functions are	not thread safe.  You have to call it once the
       program	has  started,  but  this  call must be done before the program
       starts any other	thread.	This is	required to avoid potential race  con-
       ditions in library initialization, and also due to the fact these might
       call  functions	from other libraries that are thread unsafe, and could
       conflict	with any other thread that is already using  these  other  li-
       braries.

JNI
       Accessing the Connectivity Manager though Java:

       Register	the ares_library_android_init.
	 static	JNINativeMethod	funcs[]	= {
	 { "initialize_native",	    "(Landroid/net/ConnectivityManager;)I",
	   (void *)&ares_library_init_android}
	 };

	 JNIEXPORT jint	JNICALL	JNI_OnLoad(JavaVM *vm, void *reserved)
	 {
	   JNIEnv *env = NULL;
	   jclass  cls = NULL;
	   jint	   res;

	   if ((*vm)->GetEnv(vm, (void **)&env,	JNI_VERSION_1_6) != JNI_OK)
	     return -1;

	   cls = (*env)->FindClass(env,	JNIT_CLASS);
	   if (cls == NULL)
	     return -1;

	   res = (*env)->RegisterNatives(env, cls, funcs, sizeof(funcs)/sizeof(funcs[0]));
	   if (res != 0)
	     return -1;

	   ares_library_init_jvm(vm);
	   return JNI_VERSION_1_6;
	 }
       Calling the registered function from Java:
	 public	class MyObject {
	   static {
	     System.loadLibrary("cares");
	   }

	   private static native boolean initialize_native(ConnectivityManager
	     connectivity_manager);

	   public static boolean initialize(Context context) {
	     initialize_native((ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE));
	   }
	 }
       Initializing  the Connectivity Manager in JNI directly using an Android
       Context.	It is assumed the JVM  has  already  been  registered  through
       JNI_OnLoad.
	 void initialize(jobject android_context)
	 {
	   jclass obj_cls = jni_get_class(env, "android/content/Context");
	   jmethodID obj_mid = jni_get_method_id(env, obj_cls, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;");
	   jfieldID fid	= (*env)->GetStaticFieldID(env,	obj_cls, "CONNECTIVITY_SERVICE", "Ljava/lang/String;");
	   jstring str = (*env)->GetStaticObjectField(env, obj_cls, fid);
	   connectivity_manager	= (*env)->CallObjectMethod(env,	android_context, obj_mid, str);
	   if (connectivity_manager == NULL)
	     return;
	   ares_library_init_android(connectivity_manager);
	 }

AVAILABILITY
       This function was first introduced in c-ares version 1.15.0.

SEE ALSO
       ares_library_init(3), ares_library_cleanup(3),

				 13 Sept 2017	     ARES_LIBR...IT_ANDROID(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=ares_library_init_android&sektion=3&manpath=FreeBSD+Ports+14.3.quarterly>

home | help