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

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

闪烁的标题栏 -VB资料 实现画面的各种切换方法-VB资料 实现屏幕变暗的效果 -VB资料 实现图像切换效果 -VB资料 提取Win9x拷贝的动画-VB资料 一个图像滤光处理程序-VB资料 一个用VB5.0 实现的鼠标绘图程序 用VB6.0制作画图板 用VB6设计有趣的动画场景 用VB编程绘制网格图像 用VB绘制抛物线动画曲线 用VB绘制正弦动画曲线 用VB实现“百叶窗”的图形特效 用VB实现托盘动画图标 用Visual Basic 定制BMP文件 用Visual Basic的Move方法实现动画效果 用Visual Basic与MS-Draw开发通用作图软件 在VB中获取可执行文件及Windows 95快捷方式的图标 在VB中进行各种图形切换的方法 在VB中制作可滚动的图像显示 在图片上平滑移动文字 -VB资料 VB怎样使程序的标题条闪烁? VB制作图像的Mask图 CWinInetConnection-一个封装了WinInet API函数的类 -VB资料 MODEM通讯意外处理-VB资料 MsComm 文字传输-VB资料 PING一个IP地址(向它发送一个数据包并等待回应) -VB资料 SMTP协议简介 (Simple Mail Transfer Protocol) -VB资料 VB5.0 中远程数据库的访问 VB下如何编写CRC校验程序 Visual Basic 6中发送邮件的新方法 多谢各位,为什么http://IPaddress/exchange能看到内容,但是http://IPaddress/exadmin看不到内容 数据窗口怎么获得列的个数和怎么判断列的类型为DropDownDW类型! 求助 outlook&&ie6(放分) 我写了1个ip变域名的软件,发现现在都用防火墙,根本的不到域名,能不能用dns服务器或者其他方法写代码获得? 难道真的要去请电脑技术人员来帮忙了吗?急!急!急!!! 为什么有两个连接查询变量就不行呢代码如下: Rose进行JavaOOM的超级菜问题No.1:如何设置一个类MyButton成为JButton类的子类 如何在显示汉字 有关staroffice的问题 谁能告诉我完整的正式版本Dream_controls_collection for D6的下载地址呢? 百分求解有关ODBC的问题 那位知道最好的局域网聊天软件是什么? 数据库的问题 请问PB远程备份,恢复SQL SERVER2000应该怎样实现。(备份到本地硬盘)高分赠送 VCKBASE改版了,已经重新开张了!感激我的快给分!多少不限,呵呵... 那里有FrontPage server extension下载? 我什么我的程序从数据库取不出数据 C++Builder 中有没有关于SNMP 的控件啊? if not myrecord.bof then中的BOF是什么意思啊 Sybase数据库设备存放的地方? 高分救助:300分 一個通用的聯結sql server不能運行,help me 请大虾帮忙!这个SQL语句怎么写?多谢! 求教如何将enter转换为tab? win98下如何使用命令行方式共享文件夹 请问一个关于Iterator的问题. 我想把Access数据库里的内容只保留 1 天,超过 1 天的数据自动被删掉,请问该怎样设置。 拷贝构造函数实现多态性?!!你知道吗?........... 有多少人喜欢CCTV的张越和王小丫? 请问DES的最短代码的长度是多少?急急急,多多送分! 一个关于FlexGrid与MSChart的问题 请问有没有办法把一个报表导到一个Excel中? 数据管道对象....my_pipe.dataobject="p_pipe"(已经建好的数据管道对象)为什么提示 空对象?? 好象无法调用一个动态嵌入式框架中的函数 zhq2000(俗子) 谢谢你帮忙!我还有些不明白的地方想请教一下! cmos 如何下载JDK1.3版? 在DBGrid怎样移动一行数据?高分赠送 这个问题很奇怪!关于弹出菜单。 为什么 Rs->GetFieldValue 取两个字段的时候出错,只能一次去一个字段么? 用C#如何实现在form上画一条曲线,然后用鼠标托动曲线上的某一个点,该曲线的弧度根据鼠标的移动而变化 如何选择一行数据,条件是该数据的date类型的列为空(oracle)? 强烈建议!!!! 用过MSComm的朋友看过来。 清详细介绍ActiveX 请教众英雄: 怎么用C#写一个ComboBox Web Control 谢了!to anybody1 中国共享软件注册中心的2002年2月份汇款为什么现在还没到? 请问用DELPHI的ADO挂接的VFP数据库,进行删除只能是加删除标记,如何应DELPHI彻底删? 为什么 Rs->GetFieldValue 取两个字段的时候出错,只能一次去一个字段么? 高粱熟了的拟人句 如何判断酸碱性的强弱不用ph试纸判定 碳酸氢根离子以水解还是电离为主? 高粱熟了.(改为拟人句.) 关于元素周期表的氧化性金属性稳定性酸碱性的强弱问题一直搞不懂. H2中氢元素的化合价 高粱熟了.(拟人句)帮个忙啦!2楼真是天才啊!小弟配服. 问几个有关盐的化学式!至少5个!急啊~~~ 氢元素有几种化合价最好有例子 浓硫酸和铜反应是只能体现强氧化性吗,为什么 圆柱体的侧面积怎么求?大哥们 二氧化氢中氢元素的化合价是多少 铜与浓硫酸反应现象中,哪一个证明了硫酸的强氧化性 两个圆柱体的侧面积相等,它们的什么一定相等 溴化氢中氢元素化合价 柚是酸性还是碱性 2有一个圆柱体,它的底面积与侧面积正好相等.如果这个圆柱体的底面积不变,高增加2厘米,它的表面积就增加94.2m².原来这个圆柱的表面积是多少平方厘米? 硝酸铵受热分解的2个反应(普通的和有反应条件的) 柚子是酸性还是碱性水果 元素周期表里非金属性强弱的问题如硫上面的是氧,硫右边的是氯,由于元素周期表里,向上向右非金属性都增强,那怎样判定他们氧和氯谁非金属性强呢 碳酸氢根离子的电离程度大还是水解程度大? 氢氧根中氧的化合价?是对少啊,我搅昏咯~ 秋天来了.改写成拟人句 元素周期表中非金属元素的无恙酸与含氧酸酸性强弱针对高中时期 碱式盐中的氢氧根的化合价碱式盐中氢氧根是不是中性啊 比如碱式碳酸盐怎么写 还有酸式盐中的氢呢 醋酸钠显什么性,它的电离程度和水解程度的大小比较 为什么? 怎样通过原子结构或元素周期表上看出的非金属性强弱比较硝酸、磷酸、硫酸的酸性强弱?要通过原子结构或元素周期表啊!化学必修二课本上的练习题.从元素周期表上从左到右从下到上只能 硝酸铵经过猛烈撞击后生成一氧化氮和什么?要化学方程式. 醋酸钠电离大于水解 为什么显碱性 不是应该显酸性吗 过氧化氢中氧元素和氢元素的化合价 “高粱红了.”怎么改成拟人句?按照这个格式:许多种子悄悄地露出了脑袋,探望那明媚的世界. 为什么水解大于电离,所以呈碱性? 一定条件下硝酸铵受热分解的化学方程式为5NH4NO3=2HNO3+4N2+9H2O,请用双线桥法写出,并标出电子转移数量和谁做氧化剂,谁做还原剂. 硝酸铵爆炸是机械能吗? 等体积等浓度醋酸与醋酸钠溶液混合为什电离大于水解 硝酸铵受热(或其他条件)分解产物!(希望全面一点)110 ℃时按下式分解:NH4NO3=HNO3+NH3↑ (无氧化还原反应) 在185 200 ℃,分解反应如下:NH4NO3=N2O↑+2H2O 氧化产物与还原产物物质的量 铝离子 和 硫酸根离子能共存吗?铝离子不是会水解么? 柚子是酸性还是碱性 硝酸铵受热分解方程式 在实验室中的应用 硫酸根离子和铝离子能否共存? 读者和青年文摘哪个比较好啊?有什么区别? Jazz,Rock and Roll,Western and country music are the main type of popular music.这里是西部乡村乐,还是西部音乐和乡村音乐 关于铝和硫酸根离子铝中分别加盐酸和硫酸(三者浓度质量等等都相同,铝打磨过)明显盐酸中产生气泡,而硫酸中几乎没有明显现象,很多人说是氯离子加快反应,但是硫酸中也不可能一点明显 青年文摘和读者哪个好?我是一个初中学生 觉的这两本适合这个年龄看 但不知买哪本好 各位给我看看 说说那本好 最好说详细点 有什么好听的英文歌,最好是jazz.超级好听的哦~ 柚子属于酸性还是碱性 青年文摘 读者我想给这2个杂志投同一篇文章,请问应该如何处理.文章是我原创的,还有我有想推荐的.都具体说说好么 希望大家介绍一点好听的爵士英文歌.最好是像Straight To Number One这种风格的,性感暧昧的爵士风格慢摇英文歌,不要雷死人的那种强劲版的,我很厌.由于我是新手,所以没有很多悬赏分,希望各位 圆柱体的面积该怎么求? 读者和青年文摘的文章最本质的区别是什么啊 氢氧化钙中钙元素的化合价~ 圆柱体面积怎么求 不能电离出硫酸根离子的是?1,Na2s2,Ba(OH)23,KMnO44,KCl这些哪个不能电离出硫酸根离子?为什么 讲讲 求轻爵士英文歌类似Norah Jones 的 don't know why 还有像Shelley Harland 的 In the dark,Laura Fygi的dream a Little dream 这样的,很有味道的英文歌,五六十年代的复古曲风都ok,比较抒情的~请不要复制别人的答案 圆柱体的面积,周长和 空心圆柱体,周长的求法一个空心的圆柱体,半径是10,长是12,求外面的面积.还另求圆柱体的面积,周长和空心圆柱体和空心圆柱体的求法,还有空心,但底下合着的,面积和周 知道圆柱体的侧面积咋算高? 氢氧根和氨根中各元素的化合价是多少 圆柱体面积怎么算(公式) 圆柱体的侧面积和体积计算(在线等)一个圆柱体底面半径为3厘米,侧面展开后是一个正方形,则这个圆柱体的侧面积是多少平方厘米?体积是多少立方厘米? 好听的爵士乐或英文歌把谁唱的补充下
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘