美文网首页
解决NDK日志输出文件路径过长问题

解决NDK日志输出文件路径过长问题

作者: 蛋西 | 来源:发表于2019-06-01 16:55 被阅读0次

    在ndk或者jni开发过程中,我们经常会有打日志的需求,并且需要显示日志输出的源文件名称、行数等信息,这时候就需要我们输出一个完整的日志格式。本文针对采用ndk-build方式编译,如果是采用cmake编译,不再本文讨论范围之内

    常见宏

    首先我们看一下ANSI C标准中几个标准预定义宏:

    • __LINE__:在源代码中插入当前源代码行号;
    • __FILE__:在源文件中插入当前源文件名;
    • __DATE__:在源文件中插入当前的编译日期;
    • __TIME__:在源文件中插入当前编译时间;
    • __STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;
      假设你的日志输出格式:
    #define NEW_LINE "\r\n"
    #define G_STRLOC    __FILE__ ":" G_STRINGIFY (__LINE__)
    #define DEBUG(fmt, ...) {                                 
            debug_to_file(G_STRLOC " " fmt NEW_LINE, ## __VA_ARGS__); 
    }
    

    我们可以看到,这里定义的了一个宏__FILE__这个就是当前源文件

    举个栗子

    正如上面例子所示,使用了__FILE__之后,默认情况下,输出的路径是编译该源文件时,该源文件在编译环境下的全路径,例如你的源文件路径是在/User/eggsy/Demo/src/main/jni/test.c,在该文件的58行中有代码

    58 DEBUG("ouput demo log %s","success");
    

    那么输出的时候日志就是

    /User/eggsy/Demo/src/main/jni/test.c:58 ouput demo log success
    

    这里我们看到输出的就是在源文件的全路径,当前路径看起来过长了,如果你的工程目录层级在系统更深处,那么这里前面打印出来的日志路径就非常长了,其实对我们最重要的是从jni目录开始日志路径,能够完整说明源文件路径

    解决方案

    传统方式

    先来说下传统的编译方式,采用ndk-build方式,我们经常需要在如下目录下放置Android.mkApplication.mk文件

    目录结构

    build.gradle中我们需要配置指定Android.mk文件位置

        // 引入工程外部的编译文件
        externalNativeBuild {
            ndkBuild {
                path 'src/main/jni/Android.mk'
            }
        }
    

    这种方式编译出来的,日志中源文件路径就是全路径。

    优化方式

    优化方式就是我们需要切到src/main/jni目录下,

    cd src/main/jni
    

    执行ndk-build命令

    ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk APP_BUILD_SCRIPT=Android.mk NDK_LIBS_OUT=../output/libs
    
    • NDK_PROJECT_PATH:指定工程的路径,由于我们已经cd到了jni目录,这里就用.表示当前路径
    • NDK_APPLICATION_MK:表示application的配置
    • APP_BUILD_SCRIPT:表示构建脚本的路径
    • NDK_LIBS_OUT:表示最后生成动静态的位置

    所以我们看到如上图目录结构中的ouput目录下会生成我们编译的库。
    最后生成日志的时候,就是相对路径啦,没有前面一大堆绝对路径!!!

    LOCAL_SRC_FILES源码路径

    最后距离成功还差一步,,参考上面的《目录结构》图片,在Android.mk中,在引用源文件的时候,要用相对路径,如果使用绝对路径(LOCAL_PATH变量+源文件),上面的修改就无效了,例如

    LOCAL_SRC_FILES := $(LOCAL_PATH)/andsrc/demo.c ......
    

    需要改为

    LOCAL_SRC_FILES := andsrc/demo.c ......
    

    这样的相对路径,相对路径是相对于Android.mk的当前路径而言。

    总结

    其实这个小技巧很简单,但是真正遇到的时候可能会困扰一些同学很久,最关键的就是编译的时候需要指定NDK_PROJECT_PATHNDK_APPLICATION_MKAPP_BUILD_SCRIPT参数啦,当然这些参数你也可以配置在gradle中,无需手动执行

    相关文章

      网友评论

          本文标题:解决NDK日志输出文件路径过长问题

          本文链接:https://www.haomeiwen.com/subject/jxyotctx.html