转载自: http://jingyan.baidu.com/article/a501d80cf394dfec630f5e85.html

android 自ndk r8出来以后,就开始支持纯c/c++开发,android 的纯 c/c++ 开发更有些想 win32 开发,只不过是 WinMain 变成了 android_main, 消息处理函数变成了两个,下面开始详细的介绍如何进行纯 c/c++开发,里面附带一个多点触屏的例子,希望对大家有用,谢谢!

工具/原料

  • win7 x64
  • jdk1.8.0_11
  • adt-bundle-windows-x86_64-20140702
  • android-ndk-r10

新建一个Natvie工程

  1. 1

    打开eclipse;

  2. 2

    打开菜单->File->New->Android Application;

  3. 3

    设置工程名,sdk版本,注意:主题设置为 None,点击next;

  4. 4

    Configure Project 是取消 Create activity 的复选框,点击next;

  5. 5

    Configure the attributes of the icon set, 直接点击 next;

  6. 6

    Select whether to create an activity, and if so, what kind of activity. 点击 finish即可;

  7. 7

    工程便创建出来了

    END

配置Makefile

  1. 1

    右键工程NativeTest->弹出菜单->Android Tools->Add Native Support...

  2. 2

    Settings for generated native components for project.界面 直接点击Finish

  3. 3

    将 android.mk 的内容补充完整:

    LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_MODULE    := NativeTest

    LOCAL_SRC_FILES := NativeTest.cpp

    LOCAL_LDLIBS    := -llog -landroid

    LOCAL_STATIC_LIBRARIES := android_native_app_glue

    include $(BUILD_SHARED_LIBRARY)

    $(call import-module,android/native_app_glue)

  4. 4

    增加一个 Application.mk 文件(这一步可选),并写入:

    APP_ABI := x86

    APP_CPPFLAGS := --std=c++11

    NDK_TOOLCHAIN_VERSION := 4.8

    END

代码部分

  1. 1

    1、android_main:这个函数类似于win32开发的WinMain函数

    2、app->onAppCmd = onAppCmd;

    app->onInputEvent = onInputEvent;

    类似于win32中设置窗口的回掉函数

    3、

    while ((ident=ALooper_pollAll(-1, NULL, &events,

    (void**)&source)) >= 0) {

    // Process this event.

    if (source != NULL) {

    source->process(app, source);

    }

    // Check if we are exiting.

    if (app->destroyRequested != 0) {

    return;

    }

    }

    这一段类似于win32的消息循环

    4、为了方便大家粘贴,android_main 函数的代码如下:

    void android_main(struct android_app* app) {

    // Make sure glue isn't stripped.

    app_dummy();

    app->onAppCmd = onAppCmd;

    app->onInputEvent = onInputEvent;

    while (1) {

    int ident;

    int events;

    struct android_poll_source* source;

    while ((ident=ALooper_pollAll(-1, NULL, &events,

    (void**)&source)) >= 0) {

    // Process this event.

    if (source != NULL) {

    source->process(app, source);

    }

    // Check if we are exiting.

    if (app->destroyRequested != 0) {

    return;

    }

    }

    }

    }

  2. 2

    onAppCmd 描述的是真个activity的生命周期,类似于win32开发的消息处理回掉函数:

    static void onAppCmd(struct android_app* app, int32_t cmd) {

    switch (cmd) {

    case APP_CMD_SAVE_STATE:

    // The system has asked us to save our current state.  Do so.

    __android_log_print(ANDROID_LOG_DEBUG, "fuke", "engine_handle_cmd APP_CMD_SAVE_STATE");

    break;

    case APP_CMD_INIT_WINDOW:

    // The window is being shown, get it ready.

    __android_log_print(ANDROID_LOG_DEBUG, "fuke", "engine_handle_cmd APP_CMD_INIT_WINDOW");

    break;

    case APP_CMD_TERM_WINDOW:

    __android_log_print(ANDROID_LOG_DEBUG, "fuke", "engine_handle_cmd APP_CMD_TERM_WINDOW");

    break;

    case APP_CMD_GAINED_FOCUS:

    // When our app gains focus, we start monitoring the accelerometer.

    __android_log_print(ANDROID_LOG_DEBUG, "fuke", "engine_handle_cmd APP_CMD_GAINED_FOCUS");

    break;

    case APP_CMD_LOST_FOCUS:

    // When our app loses focus, we stop monitoring the accelerometer.

    // This is to avoid consuming battery while not being used.

    __android_log_print(ANDROID_LOG_DEBUG, "fuke", "engine_handle_cmd APP_CMD_LOST_FOCUS");

    break;

    }

    }

  3. 3

    onInputEvent 主要是用来触屏相关事件,也类似于win32开发的消息处理回掉函数,函数有两部分组成:

    1、检测多点触屏,并通过logcat打印出多点触屏的信息;

    2、控制屏幕颜色变化,每次松开手时颜色变化

    3、为方便大家粘贴,onInputEvent函数的代码记录如下:

    static int32_t onInputEvent(struct android_app* app, AInputEvent* event) {

    if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) {

    int nNum = AMotionEvent_getPointerCount(event);

    char szTrace[1024] = {0};

    sprintf (szTrace, "engine_handle_input num=[%d]", nNum);

    for (int nIdx = 0; nIdx < nNum; nIdx++)

    {

    int nX = AMotionEvent_getX(event, 0);

    int nY = AMotionEvent_getY(event, 0);

    sprintf (strrchr(szTrace, 0), " (%d %d)", nX, nY);

    }

    __android_log_print(ANDROID_LOG_DEBUG, "colorspace",

    "%s", szTrace);

    if (AKeyEvent_getAction(event) != AKEY_EVENT_ACTION_UP)

    return 1;

    ANativeWindow_Buffer nativeWindow = {0};

    int nRet = ANativeWindow_lock(app->pendingWindow, &nativeWindow, NULL);

    int nArea = nativeWindow.width * nativeWindow.height;

    unsigned long* pdwScreen = (unsigned long*)nativeWindow.bits;

    static int s_nClr = 0;

    unsigned long pdwClr[] = {

    0x00000000, 0x000000ff, 0x0000ffff, 0x0000ff00,

    0x00ffff00, 0x00ff0000, 0x00ff00ff, 0x00ffffff};

    s_nClr ++;

    if (s_nClr > sizeof(pdwClr) / sizeof(unsigned long))

    s_nClr = 0;

    for (int nIdx = 0; nIdx < nArea; nIdx++)

    {

    pdwScreen[nIdx] = pdwClr[s_nClr];

    }

    ANativeWindow_unlockAndPost(app->pendingWindow);

    return 1;

    }

    return 0;

    }

    END

设置工程属性

  1. 1

    1、打开 AndroidManifest.xml

    2、打开 Application 分页

    3、增加一个 Activity

    如下所示:

  2. 2

    1、选择右边的 Browse;

    2、取消 "Display classes from sources of ..." 前面的复选框;

    3、在搜索栏输入"na",选中列出来的 "NativeActivity"

    4、点击OK

    效果如下:

  3. 3

    1、选中 android.app.nativeActivity

    2、点击 add

    3、选择 Meta Data

    4、点击Ok

  4. 4

    输入:

    android:name="android.app.lib_name"

    android:value="NativeTest"

  5. 5

    1、选中 android.app.nativeActivity

    2、点击 add

    3、选择 Intent Filter

    4、点击Ok

  6. 6

    1、选中 Intent Filter

    2、点击 add

    3、选择 Action

    4、点击Ok

    5、设置 android:name="android.intent.action.MAIN"

  7. 7

    1、选中 Intent Filter

    2、点击 add

    3、选择 Category

    4、点击Ok

    5、设置 android:name="android.intent.category.LAUNCHER"

    END

运行

  1. 1

    启动模拟器,运行效果如下:

  2. 2

    点击后效果:

  3. 3

    这次整个程序完成

    END

总结

  1. 1

    整个程序实现:

    1、android 下面的纯c/c++ 开发

    2、实现了多点触屏的功能

    3、实现了点击屏幕颜色的切换功能

  2. 2

    源代码百度云链接:http://pan.baidu.com/s/1kTokdL1 密码:fmod

采集

#HUABAN_WIDGETS .HUABAN-red-normal-icon-button, .HUABAN-red-large-icon-button, .HUABAN-red-small-icon-button, .HUABAN-white-normal-icon-button, .HUABAN-white-large-icon-button, .HUABAN-white-small-icon-button { background-image: url({{imgBase}}/widget_icons_ie6.png)

android 纯c/c++开发(转)的更多相关文章

  1. Android原生(Native)C开发之四:SDL移植笔记

    http://www.apkbus.com/forum.php?mod=viewthread&tid=1989 SDL(Simple DirectMedia Layer)是一套开放源码的跨平台 ...

  2. Android与Swift iOS开发:语言与框架对比

    Swift是现在Apple主推的语言,2014年新推出的语言,比Scala等“新”语言还要年轻10岁.2015年秋已经开源.目前在linux上可用,最近已经支持Android NDK:在树莓派上有Sw ...

  3. 详细对比IB开发与纯手码开发的优劣。

    1.IB是什么? Interface Builder 是一种通过图形化界面搭建UI的方式,并把窗口.菜单栏以及窗口上的各种控件的对象都“冻结”在了一个 NIB文档里:程序运行时,这些对象将会“苏醒”. ...

  4. 【Android UI设计与开发】第05期:引导界面(五)实现应用程序只启动一次引导界面

    [Android UI设计与开发]第05期:引导界面(五)实现应用程序只启动一次引导界面 jingqing 发表于 2013-7-11 14:42:02 浏览(229501) 这篇文章算是对整个引导界 ...

  5. 总结android项目的基本开发步骤(转帖)

    总结android项目的基本开发步骤(转帖)   做了几个android企业应用项目后,总结了项目的基本开发步骤,希望能够交流.一 应用规划:    ※确定功能.    ※必须的界面及界面跳转的流程. ...

  6. Eclipse+ADT+Android SDK 搭建安卓开发环境

    Eclipse+ADT+Android SDK 搭建安卓开发环境   要求 必备知识 windows 7 基本操作. 运行环境 windows 7(64位); eclipse-jee-luna-SR2 ...

  7. android音乐播放器开发教程

    android音乐播放器开发教程 Android扫描sd卡和系统文件 Android 关于录音文件的编解码 实现米聊 微信一类的录音上传的功能 android操作sdcard中的多媒体文件——音乐列表 ...

  8. Android腾讯微博开发之随机字符串与签名实现

    Android腾讯微博开发入门之随机字符串与签名实现   直接上代码   1.Utils类,包括签名和随机字符串   import java.util.Random; import javax.cry ...

  9. Android系统Google Maps开发实例浅析

    Google Map(谷歌地图)是Google公司提供的电子地图服务.包括了三种视图:矢量地图.卫星图片.地形地图.对于Android系统来说,可以利用Google提供的地图服务来开发自己的一些应用. ...

随机推荐

  1. MVC中使用WebMail 发送注册验证信息

    在MVC中发送Email 可以使用WebMail :使用起来十分简单.如下: WebMail.SmtpServer = ConfigurationHelper.GetValue("SmtpS ...

  2. httpd/php/mysql的安装-1

    rely:  依赖: relier, reliance , reliable : i don't think he is a reliable man . we must lay stress on ...

  3. 将List<int> 转换为用逗号连接为字符串

    List<, , , , }; string str = String.Join(",", testList.ConvertAll<string>(new Con ...

  4. POJ 1442 Black Box

    第k大数维护,我推荐Treap..谁用谁知道....                                                           Black Box Time ...

  5. FineUI第四天---PageManage的概述

    页面级别的配置PageManager控件的配置 每一个使用FineUI控件的页面都必须包含一个PageManager控件,我们可以把PageManager控件看做页面级别的参数配置(相对于Web.co ...

  6. xocde真机测试 内存查看

    如上, 有的时候真机调试, 内存和cpu占用没有被展示出来, 那么真机测试的时候怎么查看我们当前使用的内存呢, 有办法: instrument->activity monitory 点击左上角的 ...

  7. DICOM:DICOM3.0网络通信协议(续)

    转载:http://blog.csdn.net/zssureqh/article/details/44278693 题记: 近一年来一直坚持周末写博客,整理工作和闲暇之余的点点滴滴.对于新知识点.新技 ...

  8. Dynamo和Bigtable对比

    数据结构化问题        首先要提到的是两者存储数据属性上的区别,虽然两者都是以key/value形式进行存储,但Dynamo偏向存储原数据,因为其所存储的数据是非结构化数据,对value的解析完 ...

  9. BZOJ 2818

    2818:GCD Description 给定整数$N$,求$1\le x,y\le N$且$\gcd{x,y}$为素数的数对$(x,y)$有多少对. Input $N$ Output RT Samp ...

  10. 【云计算】Docker删除名称为none的Image镜像

    先上删除命令: docker images|grep none|awk '{print $3 }'|xargs docker rmi docker强制批量删除none的image镜像   真是有段时间 ...