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

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

摩托罗拉今年推智能手表,有望提高续航能力 众筹未来必拥抱众智 果合报告:iOS趋势及手游开发六大核心策略 无视OpenStack的前车之鉴,SAP等毅然支持Cloud Foundry 轻松搞定TB级数据,开源GraphLab突破人类图计算“极限值” 英特尔至强E7 v2处理器:2倍性能提升,3倍内存容量,4倍I/O带宽 著名工业设计师Yves B&#233;har:“我们并不需要三星智能手表。” 跨平台的.NET运行环境 Mono 3.2.7发布! Google石博盟:抓住全球化和移动化的机遇 ShareSDK针对Unity发布社交化组件 2014 CocoaChina开发者大会将公布触控奖学金等高校合作计划 中低端智能手机热销,未来市场或主打价格战 Facebook开源flint:一个用D语言编写的C++静态代码分析器 AMD携手BlueStacks,下半年推出零售版双操作系统 历时6年 Github发布基于Web的桌面文本编辑器:Atom Ratchet:构建移动应用原型,新版支持Android 13个最狂帅炫酷的前沿科技研究项目 打动面试官的五大技能 乐视TV和NBA签约三年互联网电视版权 首度披露大屏运营策略 支撑4.5亿活跃用户的WhatsApp架构概览 免费使用Windows?微软推Windows 8.1 with Bing实验项目 C/C++开发者必不可少的15款编译器+IDE Amazon推荐,Facebook追踪,大数据时代的“狗仔队” NewSQL登场,NuoDB告诉你未来数据库什么样 2014 Unity亚洲开发者大会&#183;中国站:技术课程全面解析 与其坐以待毙不如主动出击 软件如何避免惨遭淘汰 一周消息树:程序员想找好工作?那就学好Linux! 移动周报:开发者必须了解的10大跨平台工具 一周热点:领先Google 150年的数据可视化及WhatsApp架构解析 R语言为Hadoop注入统计血脉 海外游戏市场:Google与“开心农场”谈破局 打印乱码??? 菜鸟问题,我的一个朋友以前安了个linux可近来又不想安了,那怎么样把linux分区恢复过来?! 关于Assigned,AssignField,AssignFile,AssignValues的功能和用法! 请问win98不能正常关机如何处理。 乘坐公共汽车时的换车问题怎么作。百争求助! 如何知道已经打开了一个页面 一句话就给分:有关CLSID的小问题。 非常着急!请各位高手指点,小弟万分感谢! 求一关于日期计算的算法。 USB传输数据的问题? 票据打印一定要用数据窗口吗?有其它方法吗?请教!!! 为什么我的轩辕剑3天之痕都是日文字符,用什么软件可以改过来?解决了有分! 大伙还记得《上海大风暴》吗?谁知道哪里可以下载它的主题歌? invalid Data Packet? 急!急!急!急!急!(可以多送分) <div>一段文本,在这段文字中用鼠标选择一段,怎样才能判断这段文字是否包含在一对tag中(如<u><b>等)? 请问在广州和深圳有没有那家公司(开发或应用)的Notes Web应用,很出色的,请介绍一下,最好有联系方式,谢谢! 大家知道EA的从前么?居然有人敢惹他......残念 DOS下如何设置com口的中断使能寄存器.(具体说明) 监听服务为什么启动不了? 问:RSA加密算法中,加密长度同解密长度怎么选取?急!!! 怎样绕过代理服务接收邮件? 菜鸟问题请教。 我装上jbuilder7以后,编译原来的程序出问题了!! select distinct * into #temp from ziliao出错?错在什么地方?错误提示是。。。 服务器对象, ASP 0177 (0x80040111)ClassFactory 无法供应请求的类别? 二进制数的减法是怎样的? 各位朋友请救救我! 系统函数imagecreate(int x_size,int y_size)为什么会错误?是不是需要重新定义? sql数据库端口屏蔽怎么办? struct(结构) 类型可以转化为 Variant吗?怎么转化?然后如何将Variant类型的变量恢复为struct结构 用lotus script怎样实现对数据库指定文档的修改? 问个简单的线程问题,大家别见笑 :)!!! 关于asp.net的配置问题 jsp、oracle8.1.6的中文问题 在线等待 关于重新启动计算机的问题,谁能帮我? 各位,帮忙看看!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! daehappy进来取分,感谢给分! 各位大虾,有谁知道oracle8i,oracle9i是如何报价的,非常感谢! daehappy进来取分,感谢给分! daehappy进来取分,感谢给分! 如何驗証日期類型? 打包是如何解决vcl60的错误? 很急,谢谢 请问:单文档中如何在退出时去掉弹出的“是否保存文件“消息? 还没有见过这样的贴子,但又在实践中经常碰到的问题,怪事。。。。 ??IDispatch error #3101:什么意思?? 怎样实现程序中的取消功能 各位,上海哪边的房子便宜一点?(700左右,房内只要有简单家俱即可!) 一个<xsl:if>的问题 vc6.0 能否直接编译.mak文件?该如何配置? 关于XP中的PF使用率和字体占用内存的问题 有关安装nt server的问题 YA30-3150KN型四柱万能液压机其中YA,30,及3150KN分别是指什么呀 化学里室温,常温是多少度?化学计量单位中室温和常温分别是指多少度?知道的读者请留言,谢谢 在氯化钡溶液中通入二氧化硫气体,溶液任澄清;若将氯化钡溶液分盛两只试管,一支加硝酸,另一支加烧碱溶液,升高ph值使so2水溶液中so2-浓度增大? 函数结构没有问题,请问函数中的算法应该怎么写#include <stdio.h>/* userCode(<70字符):自定义函数之原型声明 */int fun(int arr[],int n,int *num);int main(void){\x05int arrA[5],arrB[8],num,minA,minB;\x05printf(" 冰箱冷藏室上面的开关——当室温小于10摄氏度时打开开关是什么意思?最近刚买了个冰箱,开关一直开着,请问朋友这个开关可以一直开着不管,总之,这个开关如何用?随着季节变化是否需要有 向盛有氯化钡溶液的甲乙两试管中分别通入二氧化硫至饱和,若向甲试管中加足量硝酸, 我还是不懂啊那个武装突击2的开局 请问:矿泉水可以烧开再喝吗?经常喝烧开了的矿泉水会对身体有害吗?比如说会得肾结石之类的病.抱歉,没有说明为什么烧开矿泉水喝.主要是因为我居住的地方很多人喝自来水得了肾结石( 室温与常温是不是一个概念 求八年级上册物理期中试卷(北师大版)... 如何检查氢气泄露 有人懂电子元器件吗?有人知道功放,鼠标,键盘,家用电器有到的一些普通的二,三极管.IC,稳压管.能说一些具体型号吗? 为啥女生数学学不好 硫化氢气泄漏用哪种物质处理A稀硫酸B蒸馏水C紫色石蕊试液D氢氧化钠溶液 懂电子元件的朋友进!谁知道BU102三极管用什么管可以代替!BU系列的管子不好卖啊. 高中数学现在就已经不懂了 课也补了 还是不懂 上课也抄笔记的 但回家一点都看不懂了 怎么办? 如何消除身上的静电?手一碰金属就会被电一下 懂电子元件设计的进来看看!我不懂这东西,图是照着电路板画的,这是一个手机充电器,输出是5V 500mA.闲着没事想把它改成输出5V 1000mA或更高.请问怎么改, 呼吸作用强度和氧气浓度有什么关系 点燃氢气二氧化碳欠采取什么操作 用于消毒的PP粉的化学式如上 哪些动物有大脑? 用什么点燃氢气 家用无塔供水!请问家用无塔供水原理是什么?怎么工作的?如果有电路图请附上! 什么动物没有大脑?如标题.没有大脑(或类似的器官组织)也能生存.如果没有大脑那么它们靠什么来指挥机体行为呢? 可以这样点燃氢气吗?用一个杯子装自来水,再用电把杯子里的水分解,可以直接在水面上点燃氢气吗? 家用无塔供水器对水泵的寿命有影响吗 家庭作业~~ 一道九年级物理题?(同学有的做出来,我还是不懂啊)工厂生产的酒精(p=0.8g/cm^3)含水量不得超过10%(按质量计算),质检员抽出甲、乙、丙、丁四瓶样本,查得它们的密度依次为0.81g 鸡蛋在常温下能保存多久 水银常温容易挥发,这常温是指多少度 人类大脑和其它动物的大脑有什么区别?人类大脑和鳄鱼大脑很相似? 常温指的是多少摄氏度?多少K? 动物名称 刚刚那个问题我还是不懂. 下面的表格里的"棒"是什么意思?下面的表格中水的常温是指多少摄氏度 医学上冷库 阴凉库 常温库 分别是指多少摄氏度?医学上冷库 阴凉库 常温库 分别是指多少摄氏度? 动物们都有大脑吗 请问大家这是什么电子元件?主要作用是什么? 含有动物名称的有 y和x成函数关系, 把二氧化硫和三氧化硫同时通入浓氯化钡溶液中,为什么会有二氧化硫逸出呢书上解释说,大量氢离子会抑制二氧化硫溶解, 浓硝酸常温下 一般是指多少度? 函数中映射到底是什么意思?我刚刚上高中,对于函数中映射的概念非常不清楚,课本上的定义觉得很不好理解,感激不尽啊! 这个事什么电子元件,具体作用是什么啊?如图: 人体常温多少度 函数到底是什么? 二氧化硫与氧气反应生成三氧化硫,将混合气体通入氯化钡中,可逆反应向正方向进行,二氧化硫能全部反应吗 在括号里填上动物名称.()头微利 说清楚点 这个电子元件的作用请问这个被铜丝缠绕的元件是什么 有什么作用 我这个是无线路由器不小心把那个元件按烂了 现在wifi信号不好 与我按烂了这个元件有关系吗 这是什么电子元件,有什么作用呢? 制作人的口腔上皮细胞滴生理盐水原因是在载玻片中央 为什么硝酸钠、氯化钠、硫酸钠混合后能溶于水还得到无色溶液.化学式分别是什么? 在氯化钡溶液中通入SO2气体溶液仍澄清,若将氯化钡溶液分装两支试管,第一支试管中加硝酸,第二支试管中加NaOH溶液,然后通入SO2,结果两支试管中都有白色沉淀生成,由此得出下列结论合理的是 在做口腔上皮细胞试验中,在载光片中央滴生理盐水 目的是? 电瓶车一晚上几度电充电器是60v,17ah/20ah的 一晚上8、9个小时或者说充满的话需要几度电 谁知道这个是什么电子元件呀,有什么作用呢? 氢气着火如何处理? 室温或常温指的是多少度啊? 盛有氯化钡稀溶液的甲乙两试管分别通入SO2至饱和,若向甲中加入足量硝酸,乙试管中加入足量氢氧化纳溶液则下列叙述正确的是()A .甲、乙两试管都有白色沉淀生成 B .甲、乙两试管都没
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘