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

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

专访Tiny框架创始人悠然:好的软件设计是“品”出来的 开发移动应用的7大设计要点 历时一年半 现代Web框架Phoenix 1.0正式发布 【七问七答】对话Erlang核心成员Eric Merritt 分布式文档数据库MongoDB开发版本3.1.7发布 年末巨献!SDCC 2015中国软件开发者嘉年华全面开启 Qualcomm中国2015高峰论坛:新品牌与5G技术展望 福利!MDCC 2015 免费展位等你来申请! 《近匠》Gamegou:多些坚持,瞄准海外的小团队也有春天 细说JavaScript异步函数发展历程 YoMail创始人Albert Yang:我与Email交织的程序人生 TIOBE 2015年9月编程语言排行榜:时髦语言Rust进前50 50张999元限量特惠票!SDCC2015软件开发嘉年华 首批讲师名单公布 百度安全:XcodeGhost大爆发可能只是冰山一角 北京市计算中心云计算转型:缘定OpenStack MDCC 2015移动开发者大会 八大技术专场首批议题剧透 Apple TV指南:从零开始用Swift开发个tvOS应用 React Native、开源:MDCC平台与技术Android专场全揭秘! 相约MDCC 2015 首批免费展位破茧而出 MDCC 2015召开在即,平台与技术iOS专场大咖来了! 一个iOS开发者对tvOS SDK的初探 前Twitter iOS技术团队负责人:使用第三方库的四大准则 【SDCC讲师专访】巨杉数据库创始人兼CTO王涛:SequoiaDB为何要开源? 对话函数式编程语言Roy之父Brian Mckenna GitLab获400万美元A轮融资,GitLab 8.0将很快到来 【CTO讲堂】如何构建高可用和可伸缩的架构? 未来程序员会被机器取代吗? React Native实战(一):配置和起步 集聚MDCC 2015 免费展位第二波正式放出 【深入浅出Koa】入门知识,带你以现代化开发方式构建Web应用 升级到Node V4的七个理由 支持大量ES6特性 怎么做一个类似于资源管理器中文件夹的窗口? sql问题,各位大侠请帮忙呀!!!! win98与win200的互连问题! 搞一个专业的VC程序员基地~~~~~~ 请大虾出手:MFC的DLL工程, 我实现了把一个dll工程的menu装载到我的主工程,但与其对应的Tool 怎样将一个全局数组附值后再传入一个函数或过程中,而数组中的值不变? 如何在我的程序中取得别的程序中某一控件的句柄(hwnd)? 小弟的软件刚发布请各位高手指点!来者都给分 使用存储过程建立数据集时怎样指定数据集参数? 救命:Beta2安装时候出错:在Disk1上找不到源文件。 如何将图标文件存入到一个dll文件中? ********杨家将请进********** 求救!!为什么我一打开windows就出现说缺少dll文件,storm.dll,还有load.exe.是为什么呀? 请大虾出手:MFC的DLL工程, 我实现了把一个dll工程的menu装载到我的主工程,但与其对应的ToolBar怎么调出来呢??我很着急! 在mdi表單中調用設為最大化的子表單時,它首先顯示小的子表單,然后才把它最大化,影響美觀,有何辦法解決? 关于在菜单中陷入文本框 20分求助有关SQL数据库的问题(为什么select...into语句无法执行) 哪有里Crystal Reports可以下载(无内容)? Where the 广东外贸外语学院 关于ODBC客户机端配置的问题 谁能给我一个delphi连接access数据库的实例,小弟万分感谢!!!!!!!!!!!!! 我机器里,98,2000装在C盘,XP装在D盘,现在我想只留下XP,不知道该怎么处理???????????????????????????? 如何实现5M以上的文件的上传 从windows进入unix Oracle 中文输入 是否onkeypress和onkeydown不能同时使用呀? Delphi 5下要做一个多 Y 轴的曲线图形,如何实现? 哪有xteamlindows下载?? 万分感谢!!!!! borland 会不会出一个 C# Builder? 乱码,头大了,不知道为什么pb导入excel怎么办 数据统计问题,请大侠门帮忙!急急急!!! 求解ZModem通讯协议源程序----有谁用过CZModemCore 我也不知道对不对! 最高级的问题?搞一个专业的VC程序员基地~~~~~~ 在研究directshow filter的push模式的兄弟请进 800分+工资管理原代码,如何解决ActiveReports打印图片的一个很难题;否则我快下岗了 有两个问题,每题40分,马上给分!!!! 如何使用打印机? 在爱情方面谁能做到这一点? 谁有 file cutter v1.4的注册码? 有急用! 搞一个专业的VC程序员基地~~~~~~谁愿意加入????? 最新发现:原来C++Bilder的项目文件(.bpr)是XML格式的! 关于FAT32和NTSF的问题 如何用VC实现Email的发送? 800分+工资管理原代码,如何解决ActiveReports打印图片的一个很难题;否则我快下岗了! 搞一个专业的VC程序员基地~~~~~~需要网页制作高手!! ADO 的用法 m_pRecordset->Fields->GetItem(index)->GetName() 关于CRichEditCtrl的问题之二,取的当前可见行数? 请问在哪里下载IMAIL SERVER???各位帮帮忙!!! 高手请回答,ADO和BDE到底有什么区别,你选择谁?为什么? 汽车真空mmhg和kpa之间怎么换算 原谅我有点笨- -.在101kpa时水的凝固点是0摄氏度,为什么是零摄氏度?kpa这个单位是什么意思 蛋白质的那课,什么氨基,羧基,肽键,肽链,空间结构,氨基酸,整课都听不懂啊~就通俗点解释下把,它们之间的关系,通式什么的. 关于蛋白质与氨基酸的计算问题有一条多肽链由12个氨基酸组成,分子式为CxHyOwNzS(z>12,w kPa是什么单位?表示 什么? 形容读书刻苦的成语( )( )( ) 食物蛋白质的氨基酸评分怎样通过第一限制氨基酸计算? kpa是什么物理单位啊?kpa是不是“一千帕斯卡”啊?与pa是什么关系啊?急. 形容独自刻苦读书的成语 一道关于氨基酸种类和蛋白质种类的题狼体内有A种蛋白质,20种氨基酸;兔体内有B种蛋白质,20种氨基酸.狼扑食兔后,狼体内的一个中含有的蛋白质种类和氨基酸种类最可能是( )A A+B,40B A ,20C 6.在一幅比例尺是1:2000000的地图上,量得甲,乙两地的距离是20CM.如果在另一幅地在一幅比例尺是1:2000000的地图上,量得甲,乙两地的距离是20CM。如果在另一幅地图上,甲乙两地的距离是10CM,另一 欧姆龙7200和7201,这2个型号有什么区别?哪个型号比较好? 蛋白质和氨基酸的计算 .肽链 肽键 氨基酸数目 N原子和O原子的计算 .昏死了可以帮我整理一下这方面的知识吗 计算蛋白质分子相对质量某蛋白质分子有四条肽链(工604个氨基酸)组成,氨基酸的相对分子质量平均为130请计算该蛋白质分子的相对分子质量(要求写出算式) 欧姆龙血压计7200好吗帮朋友问的,想知道欧姆龙7200这款怎么样,用着方便吗,天津到哪里买比较好 一个房间的地面面积为15平方米,是估算该房间内空气的质量.(空气的平均摩尔质量为0.029kg/mol) 表示快的成语:看书快( )吃饭快( )走路快( )水流快( )变化快( )办事快( )写字画画快( )时间流逝快( ) 一条绳子长2分之1米,用去2分之1后,还剩2分之1.判断 房间的地面面积是15m2,知空气的平均摩尔质量是2.9*10负二次方千克每摩尔,求房间空气的质量? 蛋白质分子量的计算.已知20种氨基酸的平均分子量是128,现有一蛋白质分子由两条多肽链组成,共有肽键98个,此蛋白质分子量是: 形容读书勤奋的成语 教室面积30m^3、高3m,空气的平均摩尔质量为29g/mol,则教室里空气的质量约为多少千克?如题,最好有公式的导换! 写出表示快的成语;看书快; 水流快; 吃饭快; 变化快; 走路快; 办事快; 尿干化学分析蛋白质+-是什么意思?尿干化学分析结果,蛋白质的结果是+-参考值是- 不知道是什么意思?大夫没说出什么意思来,问问大家是什么意思? 已知一间房子体积为45m3,空气平均气体摩尔质量为29g/mol,求这间屋内空气的质量 kpa代表什么计算单位 蛋白质 什么意思 在比例尺是1:300000的地图上,量得甲、乙两地的距离是12厘米,如果改用1:50000的比例尺…… kPa 是什么单位 化学上把氨基酸和蛋白质定义为同系物吗 在比例尺是1:50000的地图上,量得A、B两地间的距离是12厘米,在另一幅地图量得A、B两地之间的距离是15厘米,另一幅地图的比例尺是多少? 在比例尺为1:2000的地图上测AB两地间的图上距离为5CM,则AB两地间的实际距离为( )M -蛋白质什么意思 在生活中让你有感悟的事情的作文 已知空气的摩尔质量M=2.9×10-7kg/mol,成年人做一次深呼吸的吸入150cm3,空气,则做一次深呼吸,吸入空气质量约 kg,吸入气体分子数约为 (取一位有效数字)请详述计算过程, 鱼跃血压计和欧姆龙血压计,哪种校准? 蛋白质相对分子质量的计算胰岛素是一种蛋白质分子,它含有2条多肽链,其中A链有21个氨基酸,B链有30个氨基酸,假设每个氨基酸的分子量为128.胰岛素分子量为? 欧姆龙电子血压计 比较欧姆龙电子血压计 臂式 HEM-7200 和HEM-8102A 哪个更好一些 血压计是买欧姆龙的还是鱼跃的? 如果你是一个有心人 生活中你就会发现很多有趣的现象 有意思的事情 或者产生的一些人生感悟作文300字 表示书读得、表示精读、表示泛读、表示读书刻苦的成语(各4个) 我在长沙想买台血压计,有谁知道是鱼跃的血压计好.还是欧姆龙血压计好. 以“发现”为题的作文,写生活中有趣的现象,最后产生感悟快的 欧姆龙电子血压计怎么样? 在比例尺是1:2000000的地图上,量得两城市间的距离是6厘米,如果是在1:4000000的地图上,图上距离是多少厘米? 计算蛋白最低相对分子质量1.一种蛋白质按其重量含有1.65%亮氨酸和2.48%异亮氨酸,计算该蛋白质的最低分子质量.(亮氨酸和异亮氨酸的分子质量均为131)2.今有一毫克蛋白质,水解后分析知含 欧姆龙的电子血压计怎么这么不准?前几年我妈妈买了个欧姆龙腕式血压计,错的离谱.家里备个听诊器和水银血压计.后来有人说是因为老年人,要用上臂的,上月买了个欧姆龙7051,还是不准,手量 在一幅比例尺是1比2000000的地图上,甲乙两地间的距离是10厘米,如果在比例尺是1比4000000的图上,这两地间的距离是多少?用正反比例解正反 比例的知识解 欧姆龙电子血压计7112,7111,7200三个型号的区别.哪个好点. 上大学有意思吗?怎样能让生活变得有趣点 关于蛋白质的相对分子质量有些蛋白质要考虑二硫键(—S—S—)相对分子质量.蛋白质的相对分子质量的计算中,若通过图示或其他形式告知蛋白质中有二硫键形成时,要考虑脱去氢的质量.一 欧姆龙电子血压计7112怎样二次加压 蛋白质的相对分子质量怎么求啊 想买欧姆龙电子血压计7201一款,性能与价格如何? 节约能源 从我做起 低碳生活 作文2000字 中学生 人生哲理幽默故事 蛋白质那里完全不懂啊……就是肽键与氨基酸的关系和水分子的关系 一道有关氨基酸和蛋白质计算的高三生物题已知某基因由1206个脱氧核糖苷酸构成,其控制合成的蛋白质分子的相对分子质量为16500,那么合成该蛋白质的氨基酸的最大平均相对分子质量为( ). Kpa.abs是什么单位 在生物高一必修一的第二节的蛋白质的结构和功能中,主要是氨基酸的结构不懂什么氨基羧基连在哪啊,还有肽链、肽键的关系,都不是很清楚,
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn