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

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的网格控件具有输入功能 VB如何使用未安装的字体? VB如何由两个ASC码(区位码)复原成一个汉字? VB如何转换C代码中的高字和低字 一些字符串操作的问题和回答 -VB资料 VB怎样把VC++代码转换成VB代码 字符串中包含双引号-VB资料 字符串中文的问题 -VB资料 巧用CLIPBOARD建立图像数据库-VB资料 在VB中存取数据库中的图片 Access97的报表解决方案-VB资料 Access下如何使用通用对话框-VB资料 ADO简介 -VB资料 ADO三大对象的属性、方法、事件及常数(二)-VB资料 ADO三大对象的属性、方法、事件及常数(三)-VB资料 ADO三大对象的属性、方法、事件及常数(一)-VB资料 Data 控件使用有密码的 Access 数据库 -VB资料 Excel、Access、VB的结合应用 Microsoft SQL Server 7.0安装问题(二)-VB资料 主题: MDB文件的导出 使用 DAO-VB资料 Microsoft Access秘密、技巧和陷阱-VB资料 SQL的基本操作(1.数据类型) -VB资料 SQL的基本操作(2.数据库的相关操作)-VB资料 SQL的基本操作(3.表的相关操作) -VB资料 SQL的基本操作(4.数据的检索)-VB资料 SQL在VB中的使用及访问远程数据库 Text 转换为 Access MDB -VB资料 VB5.0数据库基础 如何合并两个图像处理的程序!! 9.9 阅读理解 (Unit 5) 求一C程序:当前目录下最新(最后)创建的文件的文件名,并将其赋给char fname[ ]. 关于数据库设计的问题(觅高手!) 有没有人用 Symantec Enterprise Firewall With VPN 7.0,给个cdkey啦 怎样才能用ado.net把数据库中一个select语句的结果,逐个显示出来。 而不用任何绑定。 有关悬浮的工具栏窗体问题,没人知道啊 第一次接触汇编CASL,请问SP,(SP),((SP))的区别?如将SP换成其他变量或寄存器是否一样? 網絡問題? 共享访问的问题 请问众高手一个语句的写法,谢谢! 大新闻:Microsoft.MSDN.Library.October.2003-TBE(3CD)出了!!!有人可以找到吗?? 请问如何设置诺顿个人防火墙的作为网关上网? 请问一下大家,大家在背mcse、ccna等考试的题库时有什么方法背最好呀,或则是用什么办法作弊最好呀? 如何通过VB向EXCEL模板写入数据? 一个运行时间错误!!! 在linux下使用highpoint的hpt372芯片做raid1,有做成功的朋友吗? WEB数据库 请问oracle的ORACLE_HOME环境变量怎么设置? 多态问题! 在游标中,如何跳出本次循环,执行下一次循环?我用的是sybase数据库 关于ShellExecute的简单问题,会的朋友都来看看啊 请问:一个简单的表单数据传送问题 如何用php获得一个表单里面的值? 100分在线紧急求救进程调度和内存分配程序,分不够再加,操作系统原理高手请进 这几天忙,提前祝中秋快乐! 高分求助win2k和SQL server 关于安全与数据备份的解决方案 在游标中,如何跳出本次循环,执行下一次循环?我用的是sybase数据库 一直没有搞清楚的问题(关于字节对齐):求助大侠---》》》》先谢了 大家好才是真的好,有个好网你一定要知道 问:物流管理信息系统与物流信息系统有什么区别! ==好的网络发文系统,应该具备哪些功能?== PHP小问题,望指教! 怎么安装grub? 怎样返回从数据库中查到的记录数目,并把它用Label显示出来啊? 提示:无法找到脚本库“/aspnet_client/system_web/1_0_357_0/webUiValication.js。请尝试手动配置此文件,或通过运行aspnet_resiis-c重 请问版主,是谁删了我的贴子,又扣我的信誉分? 高分求助win2k和SQL server 关于安全与数据备份的解决方案 请教关于CriticalSection 有一段源码帮忙分析 我打CS的时候怎么总是被踢呀? swf转avi的123456789问题 各位高手请进!!!!!!!!!!! 女朋友不留一分钱 延缓写入错误? directX8的sdk中的例子,把代码考出来后,编译时怎么会出现如下的错误? 备份的请求! junit的问题。 怎样编写程序,把输入的10个整数按逆序输出? 为什么总是碰到奇怪的问题 今天失恋散分,哇~~~~~~~~~~~~~~~ 两种化合物反应生成物中无H2O,CO2,沉淀.它们反应吗? 百利超市今天共卖水果忪10千克,比昨天卖出的3分之2少24克,昨天卖出多少千克 H2O和什么反映生成一种有磁性的黑色化合物 多多超市有25千克奶糖,16千克巧克力糖.售完后奶糖比巧克力糖多卖了16.2元(两种糖的价格相同),奶糖卖了多少钱? 超市运来一批水果糖和巧克力糖,水果糖的颗数比巧克力糖的2倍还多40颗.售货员将5颗巧克力糖和12粒水果糖包成一个小包.最后巧克力糖全部装完,水果糖还剩8颗.问:水果糖共有几颗,巧克力糖 大言数主之失的“失”具体指什么? angei的英文是什么意思 百利在超市出售的水果糖,10公斤,比昨天今天出售七分之六不太2公斤的.多少水果糖昨天公斤卖?(科算法) 如图,把大小不同的两块等腰直角三角板ABC和EDC拼在一起,使点E,C,A在同一条直线上,点D在边BC上……如图,把大小不同的两块等腰直角三角板ABC和EDC拼在一起,使点E,C,A在同一条直线上,点D在边BC上 英语翻译急求个英文互译题 砌石排水沟约600米,沉降缝多少米设置一个? 美一名侏儒少女天生患有储物癖 家中如新加坡“美丽星期天”活动现缤纷花海(美研究称因感到受尊敬50岁以上人群更调查显示日本半数国民反对《特定秘密保日本新一代消防车设计图出炉 神似机动IPCC中国宣讲会:21世纪末全球气安倍视察台风受灾地伊豆大岛 称将加强日本首相出访土耳其 欲游说其勿购中国日本首相出访土耳其 欲游说其勿购中国日本拟上调育儿休假补贴发放比例 增加澳洲85岁志愿者因慈善工作获得“默多青奥会实体火炬将在明城墙上传递◎全面理解九届十一次全委会精神需要把自治区十二届人大常委会第十一次会议“风声紧”的言外之意乌兰察布:立案查处不手软让老百姓情何以堪?北梁的民族兄弟情呼和浩特机场送“清凉”标题导航网友解读国安新援全身纹身含义 可比美新疆边防军人与千里外新娘办视频婚礼花田小农民北魏女皇超品相师修仙高手生活录闯途都市藏真黑喵的朋友很多命运之重叠真理之扉黑洞之战进击的娱乐之星乃东旅游结古旅游抚宁旅游登州旅游梅城旅游下司旅游石首旅游布拖县旅游会同旅游南河旅游福隆旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘