2025年3月28日 星期五 甲辰(龙)年 月廿七 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > 安卓(android)开发

Android JNI获取上下文Context

时间:06-01来源:作者:点击数:35

当在JNI调用Android自带的类时,经常需要传入Context参数,那怎么在JNI层获取Context呢?

我们知道Application和Activity是Context的子类,由于每个Activity对应的Context是不一样的,所以一般情况下我们使用Application的Context,它在整个程序中只有一个实例。所以现在问题就变成了怎么在JNI中获取Application呢?

Android APP在启动时会创建一个Activity Thread作为主线程,只要程序存活,这个线程就一直存在,所以我们可以考虑从Activity Thread中获取Application,查看Activity Thread的源码发现,它提供了一个方法可以获取Application,如下:

  • public Application getApplication() {
  • return mInitialApplication;
  • }

也就是说我们只需要获取到Activity Thread的对象即可,Activity Thread提供了一个静态方法用于获取其实例,如下:

  • public static ActivityThread currentActivityThread() {
  • return sCurrentActivityThread;
  • }

至此获取Context的步骤已经很清晰了,代码编写如下:

  • jobject getGlobalContext(JNIEnv *env)
  • {
  • //获取Activity Thread的实例对象
  • jclass activityThread = env->FindClass("android/app/ActivityThread");
  • jmethodID currentActivityThread = env->GetStaticMethodID(activityThread, "currentActivityThread", "()Landroid/app/ActivityThread;");
  • jobject at = env->CallStaticObjectMethod(activityThread, currentActivityThread);
  • //获取Application,也就是全局的Context
  • jmethodID getApplication = env->GetMethodID(activityThread, "getApplication", "()Landroid/app/Application;");
  • jobject context = env->CallObjectMethod(at, getApplication);
  • return context;
  • }
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门