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





  1. 1
    打开eclipse;
  2. 2
    打开菜单->File->New->Android Application;

    android 已经不用JAVA了吗 安卓为什么不用c++开发_移动开发


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

    android 已经不用JAVA了吗 安卓为什么不用c++开发_c/c++_02


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

    android 已经不用JAVA了吗 安卓为什么不用c++开发_android_03


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

    android 已经不用JAVA了吗 安卓为什么不用c++开发_c/c++_04


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

    android 已经不用JAVA了吗 安卓为什么不用c++开发_android 已经不用JAVA了吗_05


  7. 7
    工程便创建出来了

    android 已经不用JAVA了吗 安卓为什么不用c++开发_android_06


    END





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

    android 已经不用JAVA了吗 安卓为什么不用c++开发_android_07


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

    android 已经不用JAVA了吗 安卓为什么不用c++开发_开发工具_08

    android 已经不用JAVA了吗 安卓为什么不用c++开发_移动开发_09


  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)

    android 已经不用JAVA了吗 安卓为什么不用c++开发_c/c++_10


  4. 4
    增加一个 Application.mk 文件(这一步可选),并写入:
    APP_ABI := x86
    APP_CPPFLAGS := --std=c++11
    NDK_TOOLCHAIN_VERSION := 4.8

    android 已经不用JAVA了吗 安卓为什么不用c++开发_开发工具_11


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

    android 已经不用JAVA了吗 安卓为什么不用c++开发_android_12


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

    android 已经不用JAVA了吗 安卓为什么不用c++开发_android_13


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

    android 已经不用JAVA了吗 安卓为什么不用c++开发_开发工具_14

    android 已经不用JAVA了吗 安卓为什么不用c++开发_android 已经不用JAVA了吗_15


    END





  1. 1
    1、打开 AndroidManifest.xml
    2、打开 Application 分页
    3、增加一个 Activity
    如下所示:

    android 已经不用JAVA了吗 安卓为什么不用c++开发_移动开发_16


  2. 2
    1、选择右边的 Browse;
    2、取消 "Display classes from sources of ..." 前面的复选框;
    3、在搜索栏输入"na",选中列出来的 "NativeActivity"
    4、点击OK
    效果如下:

    android 已经不用JAVA了吗 安卓为什么不用c++开发_android 已经不用JAVA了吗_17

    android 已经不用JAVA了吗 安卓为什么不用c++开发_开发工具_18


  3. 3
    1、选中 android.app.nativeActivity
    2、点击 add 
    3、选择 Meta Data 
    4、点击Ok

    android 已经不用JAVA了吗 安卓为什么不用c++开发_android_19


  4. 4
    输入:
    android:name="android.app.lib_name" 
    android:value="NativeTest"

    android 已经不用JAVA了吗 安卓为什么不用c++开发_android 已经不用JAVA了吗_20


  5. 5
    1、选中 android.app.nativeActivity
    2、点击 add 
    3、选择 Intent Filter
    4、点击Ok

    android 已经不用JAVA了吗 安卓为什么不用c++开发_android 已经不用JAVA了吗_21


  6. 6
    1、选中 Intent Filter
    2、点击 add 
    3、选择 Action
    4、点击Ok
    5、设置 android:name="android.intent.action.MAIN"

    android 已经不用JAVA了吗 安卓为什么不用c++开发_开发工具_22

    android 已经不用JAVA了吗 安卓为什么不用c++开发_开发工具_23


  7. 7
    1、选中 Intent Filter
    2、点击 add 
    3、选择 Category
    4、点击Ok
    5、设置 android:name="android.intent.category.LAUNCHER"

    android 已经不用JAVA了吗 安卓为什么不用c++开发_android_24

    android 已经不用JAVA了吗 安卓为什么不用c++开发_c/c++_25


    END





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

    android 已经不用JAVA了吗 安卓为什么不用c++开发_android_26


  2. 2
    点击后效果:

    android 已经不用JAVA了吗 安卓为什么不用c++开发_开发工具_27

    android 已经不用JAVA了吗 安卓为什么不用c++开发_开发工具_28

    android 已经不用JAVA了吗 安卓为什么不用c++开发_android_29


  3. 3
    这次整个程序完成
    END



  1. 1
    整个程序实现:
    1、android 下面的纯c/c++ 开发
    2、实现了多点触屏的功能
    3、实现了点击屏幕颜色的切换功能
  2. 2
    源代码百度云链接:http://pan.baidu.com/s/1kTokdL1 密码:fmod

采集