说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

NativeActivity类在NDK中管理Activity

HTML文档下载 WORD文档下载 PDF文档下载
NativeActivity类在NDK中管理Activity

作者:Android开发网


  在Android 2.3中Google开始逐渐的放宽NDK功能,新增的NativeActivity类允许Android开发者使用C/C++在NDK环境中处理Activity的生命周期。不过Android123提醒从继承关系来看NativeActivity是Activity的子类。要使用该功能,我们必须声明一些内容:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.native_activity"
        android:versionCode="1"
        android:versionName="1.0">

    <uses-sdk android:minSdkVersion="9" />

    <application android:label="@string/app_name" android:hasCode="false">

             <activity android:name="android.app.NativeActivity"
                android:label="@string/app_name"
                android:configChanges="orientation|keyboardHidden">
              <meta-data android:name="android.app.lib_name"   android:value="native-activity" /> //android.app.lib_name是so文件的名字
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

有关如何在NDK中实现来自SDK代码,源码如下包含了使用本地语言处理感应器Sensor:

#include <jni.h>
#include <errno.h>

#include <EGL/egl.h>
#include <GLES/gl.h>

#include <android/sensor.h>
#include <android/log.h>
#include <android_native_app_glue.h>

#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-activity", __VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "native-activity", __VA_ARGS__))

/**
 * Our saved state data.
 */
struct saved_state {
    float angle;
    int32_t x;
    int32_t y;
};

/**
 * Shared state for our app.
 */
struct engine {
    struct android_app* app;

    ASensorManager* sensorManager;
    const ASensor* accelerometerSensor;
    ASensorEventQueue* sensorEventQueue;

    int animating;
    EGLDisplay display;
    EGLSurface surface;
    EGLContext context;
    int32_t width;
    int32_t height;
    struct saved_state state;
};

 static int engine_init_display(struct engine* engine) {
    // initialize OpenGL ES and EGL

     const EGLint attribs[] = {
            EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
            EGL_BLUE_SIZE, 8,
            EGL_GREEN_SIZE, 8,
            EGL_RED_SIZE, 8,
            EGL_NONE
    };
    EGLint w, h, dummy, format;
    EGLint numConfigs;
    EGLConfig config;
    EGLSurface surface;
    EGLContext context;

    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);

    eglInitialize(display, 0, 0);

     eglChooseConfig(display, attribs, &config, 1, &numConfigs);

     eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);

    ANativeWindow_setBuffersGeometry(engine->app->window, 0, 0, format);

    surface = eglCreateWindowSurface(display, config, engine->app->window, NULL);
    context = eglCreateContext(display, config, NULL, NULL);

    if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) {
        LOGW("Unable to eglMakeCurrent");
        return -1;
    }

    eglQuerySurface(display, surface, EGL_WIDTH, &w);
    eglQuerySurface(display, surface, EGL_HEIGHT, &h);

    engine->display = display;
    engine->context = context;
    engine->surface = surface;
    engine->width = w;
    engine->height = h;
    engine->state.angle = 0;

    // Initialize GL state.
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
    glEnable(GL_CULL_FACE);
    glShadeModel(GL_SMOOTH);
    glDisable(GL_DEPTH_TEST);

    return 0;
}

 static void engine_draw_frame(struct engine* engine) {
    if (engine->display == NULL) {
        return;
    }

    glClearColor(((float)engine->state.x)/engine->width, engine->state.angle,
            ((float)engine->state.y)/engine->height, 1);
    glClear(GL_COLOR_BUFFER_BIT);

    eglSwapBuffers(engine->display, engine->surface);
}

static void engine_term_display(struct engine* engine) {
    if (engine->display != EGL_NO_DISPLAY) {
        eglMakeCurrent(engine->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
        if (engine->context != EGL_NO_CONTEXT) {
            eglDestroyContext(engine->display, engine->context);
        }
        if (engine->surface != EGL_NO_SURFACE) {
            eglDestroySurface(engine->display, engine->surface);
        }
        eglTerminate(engine->display);
    }
    engine->animating = 0;
    engine->display = EGL_NO_DISPLAY;
    engine->context = EGL_NO_CONTEXT;
    engine->surface = EGL_NO_SURFACE;
}

static int32_t engine_handle_input(struct android_app* app, AInputEvent* event) {
    struct engine* engine = (struct engine*)app->userData;
    if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) {
        engine->animating = 1;
        engine->state.x = AMotionEvent_getX(event, 0);
        engine->state.y = AMotionEvent_getY(event, 0);
        return 1;
    }
    return 0;
}

static void engine_handle_cmd(struct android_app* app, int32_t cmd) {
    struct engine* engine = (struct engine*)app->userData;
    switch (cmd) {
        case APP_CMD_SAVE_STATE:
              engine->app->savedState = malloc(sizeof(struct saved_state));
            *((struct saved_state*)engine->app->savedState) = engine->state;
            engine->app->savedStateSize = sizeof(struct saved_state);
            break;
        case APP_CMD_INIT_WINDOW:
              if (engine->app->window != NULL) {
                engine_init_display(engine);
                engine_draw_frame(engine);
            }
            break;
        case APP_CMD_TERM_WINDOW:
             engine_term_display(engine);
            break;
        case APP_CMD_GAINED_FOCUS:
                   if (engine->accelerometerSensor != NULL) {
                ASensorEventQueue_enableSensor(engine->sensorEventQueue,
                        engine->accelerometerSensor);
                ASensorEventQueue_setEventRate(engine->sensorEventQueue,
                        engine->accelerometerSensor, (1000L/60)*1000);
            }
            break;
        case APP_CMD_LOST_FOCUS:
            if (engine->accelerometerSensor != NULL) {
                ASensorEventQueue_disableSensor(engine->sensorEventQueue,
                        engine->accelerometerSensor);
            }
            // Also stop animating.
            engine->animating = 0;
            engine_draw_frame(engine);
            break;
    }
}

void android_main(struct android_app* state) {
    struct engine engine;

    app_dummy();

    memset(&engine, 0, sizeof(engine));
    state->userData = &engine;
    state->onAppCmd = engine_handle_cmd;
    state->onInputEvent = engine_handle_input;
    engine.app = state;

    engine.sensorManager = ASensorManager_getInstance();
    engine.accelerometerSensor = ASensorManager_getDefaultSensor(engine.sensorManager,
            ASENSOR_TYPE_ACCELEROMETER);
    engine.sensorEventQueue = ASensorManager_createEventQueue(engine.sensorManager,
            state->looper, LOOPER_ID_USER, NULL, NULL);

    if (state->savedState != NULL) {
        engine.state = *(struct saved_state*)state->savedState;
    }

    while (1) {
        // Read all pending events.
        int ident;
        int events;
        struct android_poll_source* source;

        while ((ident=ALooper_pollAll(engine.animating ? 0 : -1, NULL, &events,
                (void**)&source)) >= 0) {

            // Process this event.
            if (source != NULL) {
                source->process(state, source);
            }

             if (ident == LOOPER_ID_USER) {
                if (engine.accelerometerSensor != NULL) {
                    ASensorEvent event;
                    while (ASensorEventQueue_getEvents(engine.sensorEventQueue,
                            &event, 1) > 0) {
                        LOGI("accelerometer: x=%f y=%f z=%f",
                                event.acceleration.x, event.acceleration.y,
                                event.acceleration.z);
                    }
                }
            }

            // Check if we are exiting.
            if (state->destroyRequested != 0) {
                engine_term_display(&engine);
                return;
            }
        }

        if (engine.animating) {
            engine.state.angle += .01f;
            if (engine.state.angle > 1) {
                engine.state.angle = 0;
            }

            engine_draw_frame(&engine);
        }
    }
}

15亿美元!软银联合GungHo收购手游巨头Supercell Oracle“炮轰”开源:称其永远无法在军事领域取得一席之地 零客户端:下一代计算分布模型 苹果聘奢侈品公司巴宝莉CEO Angela Ahrendts为零售主管 看看你会几个?9大最火的移动开发技能 为了进一步拴住用户:传亚马逊与HTC合作开发智能手机 三年?又三年!今年MDCC2013大不相同! 杨远骋:聚美优品与百度云推送的故事 糗事百科王坚:百度云推送让我们省心 10个最热JavaScript开源框架的社区活跃度对比 2013福布斯中国富豪榜:李彦宏第三、马化腾第五、马云第八 Storm又获东风,Hortonworks计划将其整合到Hadoop企业版 IBM CEO:预测高新技术 五个我最喜欢的方式 我伙呆,硅谷高级工程师年薪16.5万美金起 羡煞旁人的Supercell:Clash of Clans卫冕营收榜冠军 谷歌第三财季利润增36.5% 但摩托罗拉业务继续亏损2.48亿 针对应用开发者的几点建议:注意特征蔓延、加大用户评审…… Ubuntu中文衍生版UbuntuKylin 13.10正式发布 Web设计师和Web开发者之间的区别是什么? 在政府退出后,Google的量子计算机项目面临危机 SQL on Hadoop的最新进展及7项相关技术分享 联想:欲收购黑莓,还能在智能手机领域创造PC神话吗? 谁说Android开发者的收入依然不行? 代码可维护性的神秘面纱 MDCC 2013首批演讲嘉宾名单出炉 议题即将披露 MDCC2013:公开征集讲师和演讲主题 移动周报:IT人必看!9大最火移动开发技能 OpenStack H版发布 盘点2013:21个最火的云初创公司 从摩尔定律到原子计算,2013诺贝尔物理学奖背后的计算机技术 黄峻:从自制纸板键盘的孩子到Adobe技术经理的故事 高薪寻找西安的兼职UNIX程序员 哪有delphi的函数手册下载? 我需要全国IP分布表。 请问如何打印list control上的报表 前两天一直再问图像处理的事情,可是我用了很多方法后,还是少些什么!!就图像三原色处理来说... 为什么我的Linux只能打开国外的网站? 用resin时,“No tags”是什么错误!分必给! 热烈庆祝VBA开张! 请问在asp中如何读取/显示access数据库中的备注字段 紧急求救:在VC++里如何通过ATL OLE DB访问(INSERT\UPDATE\DELETE\SELECT)ORACLE和SQL SERVER里的BLOB字段内容? 高薪寻找西安的兼职UNIX程序 员 在delphi中,怎么调用api函数? www.alldas.de为什么无法访问了??? 如何检测被覆盖的窗口区域是否发生了变化? 高薪寻找西安的兼职UNIX 程序员 如何制作下拉菜单 请高手指点:好猫为何不工作? 一种设想,20台电脑5根电话线上网,如何达到较快的速度? 对话框程序调试时的问题?!!!! 请介绍几本好用的自学C语言的书籍好吗?? 紧急求救,请高手来看看 .NET和JAVA到底哪个好? 谁来救我?ISequentialStream::write()为何不好使? 定义类型的困惑 大虾们,如何做一个图标选择框!!!(详情见内) ADO编程问题求解!!!!!!!!!!! ****************简单问题,高分求救??????????????????????? 请问怎样在TabStrip中的选项卡中增加图片?谢了 工程如何能建的工整一些? www.alldas.de为什么无法访问了? 关于动态控件的问题 ADO编程问题求解 怎么编程产生1MHz甚至更高频率的周期信号? 紧急求助—有关JMail4.1附件问题 挥泪大送分!!!!! 怎样才能让自己变胖? 做个仅有对话框的应用,但想把它放到托盘, 给ASP爱好者提个建议! 关于SQLserver2000“视图“的两个问题,请教高手! 好久没上网了,送分以庆祝再回csdn!!!!! 做浏览器,如何实现 “后退”,“前进”,这二个功能? 如何使C:盘,D盘的根目录不共享? 用resin时,是否需要jdk,如何配置?分必给! SDI中的某一个子视图里怎样对主窗口的状态栏进行更改?? ◇◆◇ 失恋代表什么? ◇◆◇ 我英语不懂,想考高程.行吗 ◇◆◇ 学生生涯快完了,大家来说说对学生生涯的感受,特别是什么最深刻的! ◇◆◇ 求救!如何把SQL命令从前端应用程序传给应用程序服务器 要去招商行笔试了,有参加过的兄弟给点建议。 ###############讨论一下->微软全力推出.NET技术和C#语言的出现,VC++还有多久的寿命??? 要去招商行笔试了,有参加过的兄弟给点建议 五年级下册口算题练习同分母分数的200~500道之间 张奶奶家养的鸡和鸭共150只,鸡是鸭的5 倍,问张奶奶家养的鸡和鸭个多少只 已知X1,X2 是方程-3X-4X+2=0的两根,求x1+x2=?x1x2=? 五年级下册数学口算400题 奶奶家养鸡,兔若干只,鸡比兔多20只,鸡脚比兔脚多4只,奶奶家养鸡,兔各几只? 已知方程3x的平方+4x的两根是x1、x2,求1/x1的平方+1/x2的平方的值已知方程3x的平方+4x=7的两根是x1、x2,求1/x1的平方+1/x2的平方的值用韦达定理, 苏教版,越多越好! 王奶奶家有鸡兔若感知已知鸡比兔多13只共146只脚,鸡兔各几只 若方程X平方-3X-1=0的两个根为x1,x2,则1/X1 + 1/X2的值为 新疆青年出版社的 养鸡场共养鸡兔176只,已知鸡脚总数比兔脚总数多214只,问养的鸡兔各为多少只?不用方程 设方程4x的平方-3x-8=0的两根分别为x1,x2求下列代数式的值(x1-3)(x2-3) x1分之2+X2分之2 (x1-x2)的平方 小学五年级下册数学口算题60道,帮帮忙今天就要! 奶奶家喂的鸡兔共有有20个头,52只脚.奶奶家喂了多少只鸡和兔? 设x1,x2是方程2x²-3x-3=0的两个实数根,则x1/x2+x2/x1的值为 (难点的) 设方程x^3+2x^2-x+3=0在复数集C中的根是x1,x2,x3,求一元三次方程,使它在C中的根是:1) 2x1,2x2,2x32) -x1,-x2,-x33) 1/x1,1/x2,1/x3 已知方程3x²-4x-2=0的两根是x1、x2求、x1²+x2² 2、1/x1²+1/x2²3、x1三次方+x2三次方. 五年级下册数学口算带答案 设x1,x2,x3是方程x^3-x+1=0的三个根,则x1^5+x2^5+x3^5的值为 已知关于x的方程3x^2-5x+a=0的两个根为x1、x2,且-2小于x1小于0,1小于x2小于3,求实数a的取?、 五年级下册口算训练的答案.60片后的都可以.人教版 李奶奶养鸡.鸭共100只.把鸡的1/5卖掉后又买回8只鸭,现鸡鸭一样多,原来鸡鸭各几只? X1、X2为方程X²+3X+1=0的两实根,求代数式X1³+8X+20的值 五年级下册口算训练训练第29页答案 李奶奶家养了鸡鸭鹅,其中鸡占25%,鸭与鸡和鹅的总数比是1:2,鹅有66只,李奶奶家养的鸡鸭鹅共有多少只? 已知方程3x平方+5x-2=0的两个根分别为x1 x2 求代数式x1+x2+x1乘x2的值 五年级下册口算训练第6页答案什么?急啊! 养殖场共养鸡鸭12000只,鸡是鸭的2倍,那么鸡鸭各多少只?式子是怎样列? 已知x1、x2为方程xˆ2+3x+1=0的两实根,求代数式x1ˆ3+8x2 20的值 五年级下册数学口算练习第9和10页答案 张大爷家的鸡卖掉1/3,鸭卖掉1/4,剩下的鸡鸭只数相等张大爷家养的鸡卖掉三分之一,鸭卖掉四分之一后,剩下的鸡鸭只数相等,已知鸡比鸭多45只,鸭有多少只?鸡卖掉三分之一,鸭卖掉四分之一后, 已知函数f(x)=3x的平方—x的2次方,求方程f(x)=0在区间【-1,0】上实根的个数已知函数f(x)=3的x次方—x的2次方,求方程f(x)=0在区间【-1,0】上实根的个数 100道 刘奶奶家养鸡和鸭共150只,鸡的只数是鸭的5倍,刘奶奶家鸡和鸭各养多少只? 已知函数f(x)=3x次方+3x-8,用二分法求方程3x次方+3x-8=0在x∈(1,3)内近似解的过程中,取区间中点x0=2那么下一个有根区间为() 从后面开始打!人教版的,封面是绿的! 张奶奶家共养鸡和鸭150只,鸡的只数是鸭的5倍.张奶奶家养鸡和鸭各多少只? f(x)=三分之一x三次方+x方-3x,一、求图像在原点处的切线方程 二、求函数的单调区间 苏教版四年级下册口算练习 张奶奶家共养鸡和鸭150只,鸡的只数是鸭的五倍.张奶奶家养鸡和鸭各多少只? 已知函数f(x)=2x的三次方-3x的平方+3 若关于x的方程f(x)+m=0有三个不同的实根,求实数m的取值范围 北师大版四年级下册口算练习要求题量大些,能给孩子一定量的练习. 刘奶奶养鸡和养鸭共60只,鸭是鸡的20%.刘奶奶家养的鸡和鸭各多少只?要列方程, 已知函数f(x)=2/3x三次方-2x二次方-6x+1.求:曲线f(x)在x=0处的方程.求函数在区间〔-3,1〕上的最大...已知函数f(x)=2/3x三次方-2x二次方-6x+1.求:曲线f(x)在x=0处的方程.求函数在区间〔-3,1〕上的最大 五年级下册数学口算训练P3---4答案 刘爷爷养了160只鸭,养鸡的只数是鸭的八分之五.养的鸭比鸡多多少只? 已知x1,x2为方程x²+3x+1=0的两实根,则x1的三次方+8x2+20=__________________. 43 王奶奶家养鸡20只,若养的鸡比鸭多4分之1,养的鸭有( )只? x1、x2是方程3x平方+4x-7=0的两个根,利用根与系数的关系,求下列格式的值(1).x2 x1 ( 2).(x1-2)(x2-2) (3).x1-x2__ + __ x1 x2 五年级下册数学口算题及答案 王奶奶家养了25只鸡和15只鸭.根据25*3/5=15这个算式编一道乘法应用题. 设x1、x2是方程是2x^2+4x-3=0的两个根,利用根与系数的关系,求下列各式的值:1、(x1+1)(x2+1) 2、x1^2x2+x1x2^2 3、x2/x1+x1/x2 4、(x1-x2)^2 五年级下册数学口算训练第45页答案【人教版】 1.张奶奶养了30只鸭,50只鸡,鸡是鸭的( )%,鸡比鸭多( )%2.一根绳子全长12米,剪去三米,剪去是剩下的( )% 1方程x^2+2x+1=0的根为X1= X2= X1+X2= X1X2= 方程x^2-3x-1=0的根为X1= X2= X1+X2= X1X2= 方程3x^2+4x-7=0的根为X1= X2= X1+X2= X1X2=由上述的你能得出什么猜想 你能证明你的猜想吗? 人教版五年级下册数学口算训练第9页答案,急用!~~ 王奶奶家养了25只鸡和15只鸭.根据25×3/5=15这个算式编一道乘法应用题和两道除法应用题,并写步奏解答 (1)方程x²+2x+1=0的根为x1= x2= x1+x2= x1x2= (2)方程x^2-3x-1=0的根为X1= X2= X1+X2= X1X2=(3)方程3x^2+4x-7=0X1=的根为X1= X2= X1+X2= X1X2= 由上述的你能得出什么猜想 ?你能证明你的猜想吗? 主
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn