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

在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文件

解决NDK日志输出文件路径过长问题_第1张图片
目录结构

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日志输出文件路径过长问题)