zoukankan      html  css  js  c++  java
  • Android JNI get Context

    当在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;
    }
  • 相关阅读:
    软工实践1816-第四次作业
    软工实践1816-第三次作业
    软工实践1816-第二次作业
    Alpha 冲刺 (3/10)
    Alpha 冲刺 (2/10)
    Alpha 冲刺 (1/10)
    福大软工 · 第七次作业
    福大软工 · 第八次作业(课堂实战)- 项目UML设计(团队)
    福大软工1816 · 第六次作业
    福大软工1816 · 第五次作业
  • 原文地址:https://www.cnblogs.com/RaulYang/p/7737588.html
Copyright © 2011-2022 走看看