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

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);
        }
    }
}

MongoDB的得与失 开箱即用!Android四款系统架构工具 谁说Kinect只是玩物?微软研究院使用它实现口语手语实时翻译 新浪微博推出粉丝服务平台 引发两微PK大战 MDCC2013移动开发者大会最新日程发布 门票优惠最后1天 英特尔CEO:EUV光刻技术或助力芯片突破摩尔定律 从微软大数据日看到的,银行、交通、医疗实践之路 IDC:iPad市场份额遭Android平板蚕食 滑至29.6% [TUP第30期]直击移动应用开发难点 探讨跨平台最佳解决方案 用动态语言编写程序,命名更重要 命中率80%,磁盘I/O减半,Flashcache的发展史 这次它很低调:谷歌正式发布Android4.4和Nexus 5 iPhone 5S来了,iPhone 6还会远吗?概念机来袭 [开源推荐]PhysicsJS:基于JavaScript的强大的物理引擎 望虚窥实!专访Oculus Rift创始人Palmer Luckey 利益至上,开源也不免于此 开发者必备,超实用的PHP代码片段! 福利来了!AngularJS资源大集锦 移动周报:“360儿童卫士”手环的是与非 Ion Stoica和他的数据故事(上) 开发者必备:测试网站速度的五个免费在线工具 谷歌员工曝光在谷歌工作那些最糟糕的事情 MDCC 2013全民移动 玩转智能硬件展 如何降低白噪声对网站用户体验的影响? 谁才是真正的资深开发者? 东软董事长刘积仁阐述三大战略 构建以知识资产驱动的商业模式 一切皆为 JavaScript 黑莓:弃私有化任命华人为临时CEO 卖给联想的节奏? 谁说WP仍然不行?意大利WP份额已超iOS MDCC之移动娱乐游戏峰会:百家手游齐逐金玩奖 专访Mozilla宫力:基于Web是Firefox OS最大的资本 IBM软件清库存(大优惠) 〉〉〉〉〉〉〉〉求一份对旧系统进行分析、整合、优化的文档 又是闪烁,头大! 简单问题,请紧急指导.(在线) help help : fortran + dll = ? 奇怪的现象:判断不了SQL sum()查询结果!!! 2003高考试题 设置访问表命令:“access-list 2 permit 10.0.0.0 0.0.0.255”中10.0.0.0 和 0.0.0.255分别指什么? 请问谁知道这是什么缘故啊? 如何计算cpu和memory的一般的使用上限 在delphi中使用什么报表控件打印的报表效果较好 谁知道db或dbf头文件的格式? 急急 NMFtp中我想从ftp服务器下载指定文件扩展名的文件,该怎么办? 初始化页面的时候,如何使TextMode="Password"的asp:textbox有默认值显示? IBM软件清库存(大优惠) 又是可恶的乱码问题 struts与数据库!在线等待! 如何开发asp.net程序(基于vb) vc++的链接错误 如何用程序动态的获得activex控件的方法属性事件信息 请教:使用web.xml做资源约束时如何由自己的程序来做用户验证 请问:怎样编程来来虚拟网卡? 急!创建LOOKUP的问题 如何计算cpu和memory的一般的使用上限 新问题请教! 老问题:从Excel文件里把数据导入导数据库中 有汇编玩的非常牛的人吗??? 字符串操作的简单问题 学习J2EE需要装什么软件? >>有关记录的问题??<< 请高手指教:出现“ORA12663:服务器未提供客户机要求的服务”问题,怎么解决? 大侠救我! 动态sql问题请教,谢谢 填充combobox的问题 windowsxp不能创建拨号连接 怎樣轉換時間格式 ACCESS问题 Linux下上网问题?在线等待!急!急!急! 终极讨论:从Excel文件里面导入数据 winsock的问题 关于WINDOWS下邮件程序编写问题 Solaris下的Makefile问题 在lan里面的两台主机之间怎么配ppp连接,没有modem 我的SQL数据库安装的是实例,好象有问题哦! 高分求票据、合同套打代码! 事务问题,请大家帮忙,在线等待,50分相送!!!! xml解析的问题? 关于CRuntimeClass,请指教。 100分求解(在线等待) 终极讨论:从Excel文件里面导入数据 CString怎样转换为char * 类型? 数学中 钝角假设和锐角假设是指什么?谢谢.在看黎曼几何和罗巴切夫斯基几何简介的时候看到的名词. 2009初二寒假英语日记5篇 我英语不是非常好 想考本科但是要过英语a及 求方法如题 命题p:任意x∈R,x^2≥0.命题p的否定和非p分别是怎样的?我主要想搞清楚这种命题里,“否定”和“非”的区别是什么... 寒假日记(英语)5篇(初二)带翻译.不要复制的.记得要是想个国中生写得.不要跟外国人写的一样. suggestion怎么用 萍果手机发短信,怎么没有汉字、只有拼音? sb with sb+is sb and 已知二次函数 f(x),f(1)=4,f(2)=7,f(-1)=10.求这个二次函数的解析式 高数 拉格朗日乘数法(2元的)推理疑问与(7)一行的 fy(X0,y0)+λφy(x0,y0)=0 怎么推导出来的 sb with sb +is sb and sb +are English is widely used _____ travellers and business people all over the world.A.to B.as C.by D.for 请翻译, 高数 拉格朗日乘数法44题怎么算? 柔性制造单元FMC与柔性制造系统FMS有什么相同和不同?CIMS有那些基本功能模块组成? 养怡之福可得永年的永年是什么意思? 1.已知“命题p:(x-m)^2>3(x-m)”是“命题q:x^2+3x-43(x-m)”是“命题q:x^2+3x-4 这是哪国的语言啊,做了一个奇怪的梦,梦中的外国人给我讲了很多,只记住一句.WU MI TANG 乌咪汤 若偶函数f(x)的定义域为【-1,1】,且在【0,1】上单调递减,若f(1-m) 已知点O(2x,y²+4)与点Q(x²+1,-4y)关于坐标原点对称,试求x+y的值 After discussion,his suggestion is that his brother ( ) to the front.A sendingB should sendC sendD be sent 中华苏维埃第一次全国代表大会和全国第一次代表大会有什么不同?中国苏维埃第一次全国代表大会与全国第一次代表大会有什么不同(就是1921年的那一次)? “阳奉阴陪”这个词语的一、三两个字意思相反,二、四两个字意思相反,请写三个这样的词语:天南地北 上行下效南辕北辙南来北往厚此薄彼 在三角形ABC中,已知c=根号2+根号6,C=60度,求a+b的取值范围. 阴菜是什么菜 英语翻译Specious,however,has the negative suggestion of using deception to make something false appear true. 英语翻译中远物流是我国最大的中外合资第三方物流企业,随着市场竞争的加剧,企业纷纷在创新战略、加强增值服务上下功夫.中远集团为了更好的物流服务在国内、国际市场中赢得竞争优势, 两会中的人民代表大会和每五年一次的全国代表大会的区别是什么?如果本年度召开了全国代表大会,还要召开两会中的全国代表大会么? 翻译:1.你真好,给了我这么多建议(suggestion) 2.请代我向你的父母问好.(regards) 养怡之福可得永年怎样理解 几何除了欧式几何还有哪些几何大类? 陶渊明的 爱莲说为什么里面主要说的是喜欢菊花 而不说莲花呢? 请帮忙将Serving suggestion翻译成阿拉伯文, 英语翻译1、图片中使用白盒代替彩盒2、这种包装方式不能通过drop test3、详细包装方式,请查看附件的说明4、由于我们没有做过12pcs的包装方式,所以我们没有Die-lines,但我可以提供Color box的参 name that place 帮忙翻译给领导的建议信件我认为我们缺少一个关于XXX的标准文档.以此文档来约束XX的流程、记录客户需求、相关责任人和问题的解决日期.I consider that we need a formular standard document about XXX.It' 英语翻译This email is to confirm that your email has been received.If you are applying for an advertised vacancy please ensure you attach your CV and supporting documentation.Please note the company does not accept prospective applications. No one was aware_________Jane had gone.A.where that B.of the place C.of where D.the place 谁可以同时用上眉清目秀、红光满面、大步流星、心旷神怡造句急用! 曹操的"盈缩之期,不但在天;养怡之福,可得永年."是什摸意思? 22短文两篇第二课时爱莲说,陶渊明为什么独爱菊花 眉清目秀、红光满面、大步流星、心旷神怡怎样造句? “盈缩之期,不但在天;养怡之福,可得永年.幸甚至哉,歌以咏志.”意思. It got its name from the wooden fence that stood where the street now 翻译成英文“准确定位细分市场” 导入柔性化管理机制,以适应市场快速变化的需求.(翻译英文,误用翻译软件) 怎么理解“你的心里只有你”这句话?好吧,俩高二学生,约定高考后双方都没男女朋友的话便在一起,现在双方依旧没男女朋友,都开始为重本冲刺.但我写了一本青春纪念册,关于我和她的很多事 眉清目秀、疾步如飞、口若悬河造句 已知二次函数f(x)满足f(0)=f(4),且f(x)=0的两根平方和为10,图像经过(0,3)点,求f(x)的解析式如题 这表情什么意思! 英语完型 求讲解 英语翻译刚刚在微信里头看到前世是怎么死的,由于蛮无聊的,就测了一下,出来的是 粤语 笑西死,你前世既然一棵桉树,= =能帮我翻译一下吗,人家测出来的再奇葩好歹也是国语,这粤语...真心蛮 π_π……这表情是指什么意思?我送了一份礼物给心上人,是条白色长裙,她发来这个表情π_π…… 1.甲数和乙数的比是2:3,甲数占乙数的几分之几,乙数比甲数多( ),甲数比乙数少几分之几.2.小明五分之一小时走了十五分之七千米,他一小时走( )千米,走一千米要( )小时. 已知二次函数f(x)满足f(0)=f(4),且f(x)=0的两个平方和为10,图像经过(0,3)点,求f(x)的解析式. 😪这是个什么表情?什么意思? 大拇指只有两个关节,这样的结构,有什么好处?回答完整一些 考好英语笔试部分的窍门 方法 欧式几何和罗巴切夫斯基几何和黎曼几何各有什么特点,都适用什么范围, 二年级寒假关于新闻的日记(5篇) 如何使用suggestion 浙江部分行政区划调整 绍兴县上虞市撤宁波住博会市民看房重开发商 遗憾大牌通讯:历史遗迹记录昔日辉煌――泰国旧英国铜像常被挂内裤乳罩 政府被迫将其英国铜像常被挂内裤乳罩 政府被迫将其通讯:历史遗迹记录昔日辉煌――泰国旧亲善合作 睦邻友好——国内外人士积极马来西亚举办“小状元汉语经典诵读大赛巴基斯坦塔利班头目死于美无人机空袭 英国一医院医疗过失误诊流产 恐致死逾第五届中国木质玩具文化节在浙江云和开为阻法院强制执行 浙江金华一老人扬言浙江金华一智障儿命悬半空 特勤消防空宁波银行发力托管业务 首只公募基金开浙江云和经贸合作洽谈签约引资50多亿把美式“监听帝国”关入“笼子”杭城周末马拉松大派对 关键词:超越、美国无人机再次出手清除巴塔首领 和谈巴基斯坦塔利班头目死于美无人机空袭 中朝俄荣膺第14届中国吴桥国际杂技艺古巴宣布取缔私营电影放映厅瘦身达人一月怒甩23斤,分享给大家的阿里影业牵手派拉蒙,中国电影大航海时从概念车到量产,乐视还差几个发布会?助力“国际化”加速东航靠近国际投资者国产手机新“四大天王”落定,联想们能世界地球日,你能我们的家园做些什么?民国大师“傍黑”:章太炎为杜月笙修家致原油投资者:一路走来你是否也曾孤单谈谈2200万的网红:日光之下,并无你单知道有氧运动,但其实瘦肚子它更有通讯:返乡遥遥无期生活热情不熄中国女教授太牛了:新成果兼顾矛与盾,投资者必看:房地产和股市终将殊途同归从任正非到马化腾 他们才是真正的“网4年或8万公里整车质保 特斯拉新Mo凯迪拉克XT5:“雅奇”不是少数派2016款别克英朗,懂你的心声更懂你伊朗沙特石油争霸赛,谁的心机更深欧罗巴之春:从塞纳河到多瑙河(中篇·投资的最高境界是等待任正非真实身价曝光:超过马云、马化腾
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘