首页 > 软件开发 > ANDROID >

android 纯c/c++开发

来源:互联网 2023-03-17 00:14:24 247

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

代码视频的百度云链接:http://pan.baidu.com/s/1qWx3W1u 密码:i9rsXKo办公区 - 实用经验教程分享!

方便他人亦是方便自己,如果觉得还行就点下右边的投票吧,这样可以帮助其他人更快的找到解决问题的方法;有疑问的也可留言哦, 谢谢!XKo办公区 - 实用经验教程分享!

注:由于优酷对视频进行了压缩,特将高清版放到百度云,欢迎大家学习XKo办公区 - 实用经验教程分享!

工具/原料

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

新建一个Natvie工程

  • 1

    打开eclipse;XKo办公区 - 实用经验教程分享!

    XKo办公区 - 实用经验教程分享!

  • 2

    打开菜单->File->New->Android Application;XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 3

    设置工程名,sdk版本,注意:主题设置为 None,点击next;XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 4

    Configure Project 是取消 Create activity 的复选框,点击next;XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 5

    Configure the attributes of the icon set, 直接点击 next;XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 5相关内容非法爬取自百度经验
  • 6

    Select whether to create an activity, and if so, what kind of activity. 点击 finish即可;XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 7

    工程便创建出来了XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 配置Makefile

  • 1

    右键工程NativeTest->弹出菜单->Android Tools->Add Native Support...XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 2

    Settings for generated native components for project.界面 直接点击FinishXKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 3

    将 android.mk 的内容补充完整:XKo办公区 - 实用经验教程分享!

    LOCAL_PATH := $(call my-dir)XKo办公区 - 实用经验教程分享!

    XKo办公区 - 实用经验教程分享!

    include $(CLEAR_VARS)XKo办公区 - 实用经验教程分享!

    XKo办公区 - 实用经验教程分享!

    LOCAL_MODULE := NativeTestXKo办公区 - 实用经验教程分享!

    LOCAL_SRC_FILES := NativeTest.cppXKo办公区 - 实用经验教程分享!

    XKo办公区 - 实用经验教程分享!

    LOCAL_LDLIBS := -llog -landroidXKo办公区 - 实用经验教程分享!

    LOCAL_STATIC_LIBRARIES := android_native_app_glueXKo办公区 - 实用经验教程分享!

    XKo办公区 - 实用经验教程分享!

    include $(BUILD_SHARED_LIBRARY)XKo办公区 - 实用经验教程分享!

    $(call import-module,android/native_app_glue)XKo办公区 - 实用经验教程分享!

    XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 4

    增加一个Application.mk 文件(这一步可选),并写入:XKo办公区 - 实用经验教程分享!

    APP_ABI := x86XKo办公区 - 实用经验教程分享!

    APP_CPPFLAGS := --std=c 11XKo办公区 - 实用经验教程分享!

    NDK_TOOLCHAIN_VERSION := 4.8XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 代码部分

  • 1

    1、android_main:这个函数类似于win32开发的WinMain函数XKo办公区 - 实用经验教程分享!

    2、app->onAppCmd = onAppCmd;XKo办公区 - 实用经验教程分享!

    app->onInputEvent = onInputEvent;XKo办公区 - 实用经验教程分享!

    类似于win32中设置窗口的回掉函数XKo办公区 - 实用经验教程分享!

    3、XKo办公区 - 实用经验教程分享!

    while ((ident=ALooper_pollAll(-1, NULL, &events,XKo办公区 - 实用经验教程分享!

    (void**)&source)) >= 0) {XKo办公区 - 实用经验教程分享!

    XKo办公区 - 实用经验教程分享!

    // Process this event.XKo办公区 - 实用经验教程分享!

    if (source != NULL) {XKo办公区 - 实用经验教程分享!

    source->process(app, source);XKo办公区 - 实用经验教程分享!

    }XKo办公区 - 实用经验教程分享!

    XKo办公区 - 实用经验教程分享!

    // Check if we are exiting.XKo办公区 - 实用经验教程分享!

    if (app->destroyRequested != 0) {XKo办公区 - 实用经验教程分享!

    XKo办公区 - 实用经验教程分享!

    return;XKo办公区 - 实用经验教程分享!

    }XKo办公区 - 实用经验教程分享!

    }XKo办公区 - 实用经验教程分享!

    这一段类似于win32的消息循环XKo办公区 - 实用经验教程分享!

    4、为了方便大家粘贴,android_main 函数的代码如下:XKo办公区 - 实用经验教程分享!

    void android_main(struct android_app* app) {XKo办公区 - 实用经验教程分享!

    // Make sure glue isn't stripped.XKo办公区 - 实用经验教程分享!

    app_dummy();XKo办公区 - 实用经验教程分享!

    XKo办公区 - 实用经验教程分享!

    app->onAppCmd = onAppCmd;XKo办公区 - 实用经验教程分享!

    app->onInputEvent = onInputEvent;XKo办公区 - 实用经验教程分享!

    XKo办公区 - 实用经验教程分享!

    while (1) {XKo办公区 - 实用经验教程分享!

    int ident;XKo办公区 - 实用经验教程分享!

    int events;XKo办公区 - 实用经验教程分享!

    struct android_poll_source* source;XKo办公区 - 实用经验教程分享!

    XKo办公区 - 实用经验教程分享!

    while ((ident=ALooper_pollAll(-1, NULL, &events,XKo办公区 - 实用经验教程分享!

    (void**)&source)) >= 0) {XKo办公区 - 实用经验教程分享!

    XKo办公区 - 实用经验教程分享!

    // Process this event.XKo办公区 - 实用经验教程分享!

    if (source != NULL) {XKo办公区 - 实用经验教程分享!

    source->process(app, source);XKo办公区 - 实用经验教程分享!

    }XKo办公区 - 实用经验教程分享!

    // Check if we are exiting.XKo办公区 - 实用经验教程分享!

    if (app->destroyRequested != 0) {XKo办公区 - 实用经验教程分享!

    return;XKo办公区 - 实用经验教程分享!

    }XKo办公区 - 实用经验教程分享!

    }XKo办公区 - 实用经验教程分享!

    }XKo办公区 - 实用经验教程分享!

    }XKo办公区 - 实用经验教程分享!

    XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 2

    onAppCmd 描述的是真个activity的生命周期,类似于win32开发的消息处理回掉函数:XKo办公区 - 实用经验教程分享!

    static void onAppCmd(struct android_app* app, int32_t cmd) {XKo办公区 - 实用经验教程分享!

    XKo办公区 - 实用经验教程分享!

    switch (cmd) {XKo办公区 - 实用经验教程分享!

    case APP_CMD_SAVE_STATE:XKo办公区 - 实用经验教程分享!

    // The system has asked us to save our current state. Do so.XKo办公区 - 实用经验教程分享!

    __android_log_print(ANDROID_LOG_DEBUG, "fuke", "engine_handle_cmd APP_CMD_SAVE_STATE");XKo办公区 - 实用经验教程分享!

    break;XKo办公区 - 实用经验教程分享!

    case APP_CMD_INIT_WINDOW:XKo办公区 - 实用经验教程分享!

    // The window is being shown, get it ready.XKo办公区 - 实用经验教程分享!

    __android_log_print(ANDROID_LOG_DEBUG, "fuke", "engine_handle_cmd APP_CMD_INIT_WINDOW");XKo办公区 - 实用经验教程分享!

    break;XKo办公区 - 实用经验教程分享!

    case APP_CMD_TERM_WINDOW:XKo办公区 - 实用经验教程分享!

    __android_log_print(ANDROID_LOG_DEBUG, "fuke", "engine_handle_cmd APP_CMD_TERM_WINDOW");XKo办公区 - 实用经验教程分享!

    break;XKo办公区 - 实用经验教程分享!

    case APP_CMD_GAINED_FOCUS:XKo办公区 - 实用经验教程分享!

    // When our app gains focus, we start monitoring the accelerometer.XKo办公区 - 实用经验教程分享!

    __android_log_print(ANDROID_LOG_DEBUG, "fuke", "engine_handle_cmd APP_CMD_GAINED_FOCUS");XKo办公区 - 实用经验教程分享!

    break;XKo办公区 - 实用经验教程分享!

    case APP_CMD_LOST_FOCUS:XKo办公区 - 实用经验教程分享!

    // When our app loses focus, we stop monitoring the accelerometer.XKo办公区 - 实用经验教程分享!

    // This is to avoid consuming battery while not being used.XKo办公区 - 实用经验教程分享!

    __android_log_print(ANDROID_LOG_DEBUG, "fuke", "engine_handle_cmd APP_CMD_LOST_FOCUS");XKo办公区 - 实用经验教程分享!

    break;XKo办公区 - 实用经验教程分享!

    }XKo办公区 - 实用经验教程分享!

    }XKo办公区 - 实用经验教程分享!

    XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 3

    onInputEvent 主要是用来触屏相关事件,也类似于win32开发的消息处理回掉函数,函数有两部分组成:XKo办公区 - 实用经验教程分享!

    1、检测多点触屏,并通过logcat打印出多点触屏的信息;XKo办公区 - 实用经验教程分享!

    2、控制屏幕颜色变化,每次松开手时颜色变化XKo办公区 - 实用经验教程分享!

    3、为方便大家粘贴,onInputEvent函数的代码记录如下:XKo办公区 - 实用经验教程分享!

    static int32_t onInputEvent(struct android_app* app, AInputEvent* event) {XKo办公区 - 实用经验教程分享!

    if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) {XKo办公区 - 实用经验教程分享!

    int nNum = AMotionEvent_getPointerCount(event);XKo办公区 - 实用经验教程分享!

    char szTrace[1024] = {0};XKo办公区 - 实用经验教程分享!

    sprintf (szTrace, "engine_handle_input num=[%d]", nNum);XKo办公区 - 实用经验教程分享!

    for (int nIdx = 0; nIdx nNum; nIdx )XKo办公区 - 实用经验教程分享!

    {XKo办公区 - 实用经验教程分享!

    int nX = AMotionEvent_getX(event, 0);XKo办公区 - 实用经验教程分享!

    int nY = AMotionEvent_getY(event, 0);XKo办公区 - 实用经验教程分享!

    sprintf (strrchr(szTrace, 0), " (%d %d)", nX, nY);XKo办公区 - 实用经验教程分享!

    }XKo办公区 - 实用经验教程分享!

    __android_log_print(ANDROID_LOG_DEBUG, "colorspace",XKo办公区 - 实用经验教程分享!

    "%s", szTrace);XKo办公区 - 实用经验教程分享!

    if (AKeyEvent_getAction(event) != AKEY_EVENT_ACTION_UP)XKo办公区 - 实用经验教程分享!

    return 1;XKo办公区 - 实用经验教程分享!

    XKo办公区 - 实用经验教程分享!

    ANativeWindow_BuffernativeWindow = {0};XKo办公区 - 实用经验教程分享!

    int nRet = ANativeWindow_lock(app->pendingWindow, &nativeWindow, NULL);XKo办公区 - 实用经验教程分享!

    XKo办公区 - 实用经验教程分享!

    int nArea = nativeWindow.width * nativeWindow.height;XKo办公区 - 实用经验教程分享!

    unsigned long*pdwScreen = (unsigned long*)nativeWindow.bits;XKo办公区 - 实用经验教程分享!

    XKo办公区 - 实用经验教程分享!

    static int s_nClr = 0;XKo办公区 - 实用经验教程分享!

    unsigned long pdwClr[] = {XKo办公区 - 实用经验教程分享!

    0x00000000, 0x000000ff, 0x0000ffff, 0x0000ff00,XKo办公区 - 实用经验教程分享!

    0x00ffff00, 0x00ff0000, 0x00ff00ff, 0x00ffffff};XKo办公区 - 实用经验教程分享!

    s_nClr ;XKo办公区 - 实用经验教程分享!

    if (s_nClr > sizeof(pdwClr) / sizeof(unsigned long))XKo办公区 - 实用经验教程分享!

    s_nClr = 0;XKo办公区 - 实用经验教程分享!

    XKo办公区 - 实用经验教程分享!

    for (int nIdx = 0; nIdx nArea; nIdx )XKo办公区 - 实用经验教程分享!

    {XKo办公区 - 实用经验教程分享!

    pdwScreen[nIdx] = pdwClr[s_nClr];XKo办公区 - 实用经验教程分享!

    }XKo办公区 - 实用经验教程分享!

    ANativeWindow_unlockAndPost(app->pendingWindow);XKo办公区 - 实用经验教程分享!

    return 1;XKo办公区 - 实用经验教程分享!

    }XKo办公区 - 实用经验教程分享!

    return 0;XKo办公区 - 实用经验教程分享!

    }XKo办公区 - 实用经验教程分享!

    XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 设置工程属性

  • 1

    1、打开AndroidManifest.xmlXKo办公区 - 实用经验教程分享!

    2、打开 Application 分页XKo办公区 - 实用经验教程分享!

    3、增加一个 ActivityXKo办公区 - 实用经验教程分享!

    如下所示:XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 2

    1、选择右边的 Browse;XKo办公区 - 实用经验教程分享!

    2、取消 "Display classes from sources of ..." 前面的复选框;XKo办公区 - 实用经验教程分享!

    3、在搜索栏输入"na",选中列出来的 "NativeActivity"XKo办公区 - 实用经验教程分享!

    4、点击OKXKo办公区 - 实用经验教程分享!

    效果如下:XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 3

    1、选中 android.app.nativeActivityXKo办公区 - 实用经验教程分享!

    2、点击 addXKo办公区 - 实用经验教程分享!

    3、选择 Meta DataXKo办公区 - 实用经验教程分享!

    4、点击OkXKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 4

    输入:XKo办公区 - 实用经验教程分享!

    android:name="android.app.lib_name"XKo办公区 - 实用经验教程分享!

    android:value="NativeTest"XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 5

    1、选中 android.app.nativeActivityXKo办公区 - 实用经验教程分享!

    2、点击 addXKo办公区 - 实用经验教程分享!

    3、选择 Intent FilterXKo办公区 - 实用经验教程分享!

    4、点击OkXKo办公区 - 实用经验教程分享!

    XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 6

    1、选中 Intent FilterXKo办公区 - 实用经验教程分享!

    2、点击 addXKo办公区 - 实用经验教程分享!

    3、选择 ActionXKo办公区 - 实用经验教程分享!

    4、点击OkXKo办公区 - 实用经验教程分享!

    5、设置android:name="android.intent.action.MAIN"XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 7

    1、选中Intent FilterXKo办公区 - 实用经验教程分享!

    2、点击 addXKo办公区 - 实用经验教程分享!

    3、选择 CategoryXKo办公区 - 实用经验教程分享!

    4、点击OkXKo办公区 - 实用经验教程分享!

    5、设置android:name="android.intent.category.LAUNCHER"XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 运行

  • 1

    启动模拟器,运行效果如下:XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 2

    点击后效果:XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 3

    这次整个程序完成XKo办公区 - 实用经验教程分享!

  • 总结

  • 1

    整个程序实现:XKo办公区 - 实用经验教程分享!

    1、android 下面的纯c/c 开发XKo办公区 - 实用经验教程分享!

    2、实现了多点触屏的功能XKo办公区 - 实用经验教程分享!

    3、实现了点击屏幕颜色的切换功能XKo办公区 - 实用经验教程分享!

  • 2

    方便他人亦是方便自己,如果觉得还行就点下下边的投票吧,这样可以帮助其他人更快的找到解决问题的方法;有疑问的也可留言哦, 谢谢!XKo办公区 - 实用经验教程分享!

    android 纯c/c  开发XKo办公区 - 实用经验教程分享!

  • 以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!XKo办公区 - 实用经验教程分享!


    标签: Android

    办公区 Copyright © 2016-2023 www.bgqu.net. Some Rights Reserved. 备案号:湘ICP备2020019561号统计代码