android 純c/c++開發(轉)


轉載自: 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM