title: How to get the Android context instance when calling JNI method?
body: <p>I have already read some relevant answers on stackoverflow,but seems no one has answered my question.I will get the android ID from native code,i.e. calling the method getAndroidIDfromNativeCode in C code,(so the JVM is inited in the native code by method create_vm),you know that when calling the method <strong>getContentResolver</strong>,you must use a <strong>Android Context instance</strong> to call it,so how to get this <strong>Context instance</strong>?    </p>
  
  <pre><code>    static jstring
      native_code_getAndroidID(JNIEnv *env, jobject thiz)
      {
          jclass c_settings_secure = (*env)-&gt;FindClass(env, "android/provider/Settings$Secure");
          jclass c_context = (*env)-&gt;FindClass(env,"android/content/Context");
          if(c_settings_secure == NULL || c_context == NULL){
              return NULL;
          }
          //Get the getContentResolver method
          jmethodID m_get_content_resolver = (*env)-&gt;GetMethodID(env, c_context, "getContentResolver",
                                                                 "()Landroid/content/ContentResolver;");
          if(m_get_content_resolver == NULL){
              return NULL;
          }
          //Get the Settings.Secure.ANDROID_ID constant
          jfieldID f_android_id = (*env)-&gt;GetStaticFieldID(env, c_settings_secure, "ANDROID_ID", "Ljava/lang/String;");
  
          if(f_android_id == NULL){
              return NULL;
          }
          jstring s_android_id = (*env)-&gt;GetStaticObjectField(env, c_settings_secure, f_android_id);
  
          //create a ContentResolver instance context.getContentResolver()
          /*
            where can I get the context instance from Anroid APP??
          */
          jobject o_content_resolver = (*env)-&gt;CallObjectMethod(env, context, m_get_content_resolver);
          if(o_content_resolver == NULL || s_android_id == NULL){
              return NULL;
          }
          //get the method getString
          jmethodID m_get_string = (*env)-&gt;GetStaticMethodID(env, c_settings_secure, "getString",
                                                             "(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;");
  
          if(m_get_string == NULL){
              return NULL;
          }
          //get the Android ID
          jstring android_id = (*env)-&gt;CallStaticObjectMethod(env, c_settings_secure,
                                                              m_get_string,
                                                              o_content_resolver,
                                                              s_android_id);
          return android_id;
      }
  
      JNIEnv* create_vm() {
        JavaVM* jvm;
        JNIEnv* env;
        JavaVMInitArgs args;
        JavaVMOption options[1];
  
        /* There is a new JNI_VERSION_1_4, but it doesn't add anything for the purposes of our example. */
        args.version = JNI_VERSION_1_4;
        args.nOptions = 1;
        options[0].optionString = "-Djava.class.path=-jar-path";
        args.options = options;
        args.ignoreUnrecognized = JNI_FALSE;
  
        JNI_CreateJavaVM(&amp;jvm, (void **)&amp;env, &amp;args);
        return env;
      }
  
      char *jstringTostr(jstring android)
      {
        ...
      }
  
      //I will call this function from native code.
  
      char *getAndroidIDfromNativeCode()
      {
  
        JNIEnv* env = NULL;
  
        env = create_vm();
        jstring androidID = native_code_getAndroidID(env,NULL);
        return jstringTostr(androidID);
  
      }
  </code></pre>