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

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

云适配CEO陈本峰:8年磨一剑 Splashtop企业应用:SplashApp让办公移动起来 时空旅行+内付费“植物大战僵尸2”下月18日全球同步发行! 中移动推网络电话Jego 后来者能否居上? 防止数据泄露:BYOD下的管理员5大妙招 咕咚副总裁司建铭谈移动时代的“软硬整合” 未来的物联网结点:可穿戴设备 应用开发的4个技巧,让程序能真正为用户使用 Google早期的10个API:它们现在在哪? 为啥微软开发产品总是慢半拍? Visual Studio 2013 Preview新功能预览 “中国手机游戏四月流水榜”出炉 超半数基于Cocos2d-x引擎 为移动而设计之信息架构篇 难逃厄运:Zynga将关闭Draw Something母公司OMGPOP 直接拿来用!最火的iOS开源项目(一) 是时候抛弃Eclipse转向IntelliJ了 Arrow:轻量级的Python时间日期库 编程语言API,你最青睐哪一款? 推动新输入方式发展:英特尔为感知计算设1亿美元基金 AWS到底有多大?目前看来有158000台服务器 C语言实现树的动态查找 第五届中国云计算大会于北京隆重举行 改变企业移动化:新Google地图API支持用户定制 诺基亚旗舰手机EOS真机图曝光 配备“巨型”摄像头 走进豆瓣:豆瓣的技术架构与团队文化分享 加速Web开发的10款HTML5工具 微软式微?AMD、英特尔等开始疏远Windows 语音技术现状:四千万突破语音产业的技术壁垒? 万维网联盟W3C推荐Web性能API 微软郑子颖:Windows Azure如何支持开源系统和软件? EMC 叶成辉:软件定义数据中心实现统一、开放的管理 c、odbc、嵌入式sql的关系? 简单的重载问题! 用<input type="fiel" name="test">时,怎样判断输进去的文件是硬盘上实际存在的? 请问哪里有eclipse 下载? FINDING SOMEBODY! 显示器不亮,请帮忙,解决给100分 写在3.15黎明的前夕 **冗余醒目**《如何在输入的时候减小冗余》**冗余醒目** 各位,CSDN的论坛都是用些什么工具开发的?? 请问个位大虾,我的程序为什么不能执行(TC++3.0) 在VC中怎么调用IE来显示一个页面? 怎样在新开的页面给已开的页面上的一个TextBox插入新的字符串 [转贴]网络版权问题 **冗余醒目**《如何在输入的时候减小冗余》**冗余醒目** 用purify测试过的release版本怎么在别人的计算机上运行有问题? 如果用asp连接mysql,请问连接字符串是什么? 我要做一个在小型的对等网上运行的数据库软件,用什么方法好点? 如果用asp连接mysql,请问连接字符串是什么? 请高手帮我解答一个关于在ASP中调用存储过程的问题? 怎么输入繁体字? 足彩-03010期:1033031110310 请教高手在DELPHI里怎样实现把一个文件存储到ORACLE上, 然后又如何调出来使用?? 我快疯了救救我!!!!!!!!!! 我为什么要做个刁民? 屏幕上显示绘多条曲线,要对每条曲线单独进行操作如何实现? 怎样避开程序对softice和trw的检查 想学ACCP不知道社会的认可度? 怎样使用windowsxp/2000的修复程序? C:\winnt\下有一个hh.exe文件,有什么作用? 这首诗我觉得用在程序员身上也很合适 在WebSnap中如何实现gride的隔行显示不同颜色,就象我们现在看到的一样?? 关于《C++ Primer plus(中文版)第四版〉》,大家发表一下看法好吗。 中文文件 颜色代码转换的问题大家帮忙呀.. 程序编译问题 问一个可笑的问题。希望能得到回复 那位用过TfcShapeBtn控件? 急!从NT4到W2000后,为何ASP出错? combustion? 100分有人答了吧 WHERE TO DOWNLOAD??? c#/web,有个约一万行的参数表需用于校验页面录入的数据 帮帮忙啊,急啊 谁有dhtml的中文帮助? 如何使窗口全屏化,即不覆盖Toplevel窗口(winamp),又能覆盖任务栏? 请教各位高手,怎样将网卡的MAC地址与IP地址绑定起来,让用户不能改变? 我自己构造了一个HTTP请求头想要下载swf,但是服务器不接受请求。各位大哥帮忙看一下 简单问题 关于dll的基本问题 求求各位了,急啊(原程序问题) 这段程序问题出在哪儿? 小亮和小东一起把蓝色块状胆矾放在研钵中研磨 发现变成了蓝色粉末 小亮问:“胆矾研碎事发生了什么变化他们将一小块胆矾合少量粉末分别放入两只试管中各加2ml水后振荡结果均观察到 这篇文章该怎么解释只管往前走的牛它只管往前走,每个脚步都是深重的,深重地扎在泥土里,每颗汗珠都是结实的,结实地撒落在田野上它只管往前走,前面只有黑褐色的泥土.肩负重扼,在深深的 ]在三角形ABC中,AB=AC=2,BC边上有200个不同德点,P1,P2,…,P200.记Mi=AP的平...]在三角形ABC中,AB=AC=2,BC边上有200个不同德点,P1,P2,…,P200.记Mi=AP的平方i+BPi×PiC(i=1,2,3,…,200)试求M1+M2+…+M200的值. 带鱼的卵在深海里会爆吗 求原生质体培养基 CM-Ⅰ、原生质体分离、纯化所用的MR、MPS、CPW配制方法CM-Ⅰ是原生质体培养基,MR、MPS、CPW是原生质体分离纯化(双界面悬浮法)时用的,求这些溶液(CM-Ⅰ、MR、MPS、CPW)的 如图,△ABC中,AB=AC=2,BC边上有10个不同的点P1...如图,△ABC中,AB=AC=2,BC边上有10个不同的点P1,P2,…P10,记Mi=APi2+PiB•PiC(i=1,2,…,10),那么,M1+M2+…+M10=_____,m1=_____ 块状的蓝矾和粉末状的蓝矾分别溶解后,成为蓝色______的溶液 植物体细胞杂交的第一步是去除细胞壁,分离出有活力的原生质体,目前比步骤最常用的是酶解法,也就是在温植物体细胞杂交的第一步是去除细胞壁,分离出有活力的原生质体,目前比步骤最 .∠ABC内有一点P,在BA,BC边上各取一点P1,P2,使△PP1P2的周长最小 不蓝我粉你 植物组培中要用酶解法去除细胞壁吗 只用胶头滴管和试管无法分别的是A KOH溶液和ALCL3溶液 BMgcl2溶液和氨水CNaAl(oH)4溶液和盐酸 DNa2Co3溶液和盐酸请说明理由 滋养的反义词快 钢铁和石头都属于哪种物理属性 Al2(SO4)3和盐酸, 只用试管和胶头滴管能鉴别么,为什么 “地铁”有哪几种译法? 线段ab=40mm,在直线ab上画线段bc=16mm,d是ac的中点,求cd的长度 受日本和辐射影响,不知道以后什么物品会大幅上涨?就像前几天的盐一样,人们想疯了一样抢购,日本不还没乱 国人倒先乱了.各位说说各自的看法 兴隆的近义词和反义词 物理钢铁重量怎么求物理钢铁公式 哈柏定律怎样证明宇宙大爆炸哈柏定律是怎样证明宇宙大爆炸或者宇宙在膨胀的,不要太复杂, 什么银白色固体能变红色 战斗机 音障那个F14突破音障的时候为什么会解体?现在战斗机的速度不都是1点几倍的音速么,为什么没有事?还有战斗机突破音障那一瞬间是不是周围都有气流?战斗机突破音障的时候是不是什 我们现在这个宇宙的物理定律只是现在用,宇宙大爆炸之前的物理是怎么样的? 求高手分析下这篇雅思大作文剑9T1的作文,可以得几分?有什么不好的地方?怎么改进? 穿越音障瞬间.大家都知道当战斗机跨越声速的一瞬间会产生音爆这种震耳欲聋的巨响,但战斗机周围的那一团锥型的雾是怎么会事,是只要物体运动速度穿越音障都会看到么?(排除大气层外) 为什么说宇宙大爆炸时期所有科学定律预见未来的能力都消失了 数学问题:作业的应用题某文具工厂要加工图画工具2500套,加工1000套后,采用了新技术,使每天的工作效率是原来的1.5倍,结果提前5天完成任务,求该文具厂采用新技术前平均每天加工多少套图 英语翻译如题 所谓音障发生的原理rt所谓战斗机音障发生的原理 应急灯电源如何让节能灯发光普通手提的应急灯未经过逆变器却直接接在220V的节能灯(白帜灯)上就能正常发光是怎么回事?如何可以做到? 在生活中我们应该具备那些常识. 已知:如图,AB//DC,AB=DC,O是DB上一点,过点O的直线分别交DA和BC的延长线于点E、F.求证:∠E=∠F 应急灯需要用两路双电源吗? 怎么样才能适应社会,并且也能在社会上生存的方法是什么? 已知四棱锥P-ABCD的底面为直角梯形,AB平行DC,角DAB=90°,PA垂直底面ABCD且PA=AD=DC=1/2AB=1M是PB中点(1)求点B到平面MAC的距离(2)求二面角M-AC-B大小上图错了 消防应急灯电源接总开关的下端吗消防应急灯电源接在照明总开关的下端还是上端.消防应急灯电源可以在总开关上端加个熔断器供给消防应急灯电源. 忘记的反义词是什么 CuCO3和Cu(OH)2的混合物22.2g,可恰好完全溶于100毫升,4摩尔每升的盐酸溶液中加热分解等量的这种混合物可得CuO的质量多少克? 滋润的反义词 忘的反义词是什么 如图,在直角梯形ABCD中,AB//CD,DA⊥AB,CD=2,AB=3,AD=7,在AD上能否找到一点P,使三角形PAB和三角行P 滋润的反义词是什么? 生物上说的植物可以进行离体培养,但要有培养基,请问培养基该怎样配? 假文盲的作文怎么写. 注塑模.压铸模,冲压模模具的相同点和不同点 红曲霉的原生质体诱变成功后,通过什么培养基进行培养?RT 假文盲作文怎么写 塑胶模和冲压模什么区别? 我想把应急灯加个开关,就是断电之后可以控制灯的开关,我应改怎么弄. 已知静水速度、水速求路程 (快的话. 模具之间有什么不同啊.主要是注塑模冲压模和压铸模 消防应急灯拔掉电源后灯亮,求方法使灯熄灭.有没有开关直接关了它 我搭的鸡舍共三层,上一层养鸽子,下面两层养鸡,这样可以吗? 价格走势:冲压模,铸造模,锻造模,拉丝模,成型模,压铸模,冲裁模,弯曲模我们企业的主要产品有:冲压模,铸造模,锻造模,拉丝模,成型模,压铸模,冲裁模,弯曲模谁知道这些产品的最新市场价格 端盖的冲压模具设计 冬天小户养鸡怎么给鸡舍加温 压铸模与塑胶模有什么不同 有没有做冲压模具设计的朋友 母爱可以拯救一切是谁写的? 斯诺登新照:在莫斯科乘游览船 未戴眼秘鲁组成新内阁日媒说日本也是美国谍报对象斯诺登在俄觅得网站工作 11月1日开以色列再次兴建犹太人定居点 被指破坏中美旅游行业业者看好赴美自驾游前景约旦河西岸推进环保 巴以或实现“环境巴官员称以色列炮击加沙地带 一名武装万圣节作掩护 女子藏毒南瓜闯加拿大海万圣节作掩护 女子藏毒南瓜闯加拿大海俄八旬老汉野外斗熊 被摔下悬崖后逃出奥巴马豪华座驾“野兽”细节曝光【图】津巴布韦教师涉猥亵性侵多名男生 用\女子坚持每天喝3升水 4周后外貌似年大型科技公司虎视美国医保网站改造律师:斯诺登在俄找到网站工作 今日开尼日尔移民车沙漠抛锚 致90人脱水而日本最新型潜艇“黑龙”下水 苍龙级潜迪拜居民将可享受一天免费公共交通 超注册零门槛屌丝也能开公司 专家:法律土耳其买中国导弹为何一波三折这篇文章,送给曾经对着Excel痛哭偏执却管用的 10 条 Java 编面向对象:一位在北京的程序媛代码能不能不要写得这么烂?!中朝举行开城、安州志愿军烈士陵园修缮坦桑尼亚大选拉开帷幕1398元三星全网通手机发布 小米看安卓用户福音 你们也即将用上新Emo仅凭这一招 就可以知道你会不会用手机QQ空间营销推广教程:做QQ空间推广布里吉特·吉罗:爱情没那么美好小王子离开之后:玫瑰最后的时光如何度是你把生活想得太复杂成熟的过程是那样的不堪不要太用力去生活如果可以放肆一回,你最想做什么?他眼里透露出的那股子忧伤,实则是压抑奈何一个人随着年龄增长,梦想便不复轻你不是脾气太坏,而是格局太小跟陈赫离婚的蕾拉,变成了雷拉快速减肥秘籍大公开(珍藏版)
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘