深入浅出Android NDK之往logcat输出日志

目录
上一篇 深入浅出Android NDK之使用RegisterNatives函数动态注册native函数

往logcat输出日志在ndk开发的过程的一个硬性需求,虽然现在可以使用Android Studio打断点进行调试了,但是并不好用。大多数情况下,我们还是使用往logcat输出日志的方式来调试程序。
C语言的printf和C++的cout是将日志输出到控制台,但在Android上,控制台是不可见的。所以我们要想显示日志,只能将log输出到logcat上。
android/log.h提供了往logcat输出日志的函数,我们看一个最常用的。

int __android_log_print(int prio, const char* tag, const char* fmt, ...)

和C语言的printf函数相比,这个函数多了prio和tag两个参数。
tag是一个标签,可以随意指定。
参数prio,不同级别的日志在logcat中会以不同的颜色显示,定义如下:

typedef enum android_LogPriority {
  /** For internal use only.  */
  ANDROID_LOG_UNKNOWN = 0,
  /** The default priority, for internal use only.  */
  ANDROID_LOG_DEFAULT, /* only for SetMinPriority() */
  /** Verbose logging. Should typically be disabled for a release apk. */
  ANDROID_LOG_VERBOSE,
  /** Debug logging. Should typically be disabled for a release apk. */
  ANDROID_LOG_DEBUG,
  /** Informational logging. Should typically be disabled for a release apk. */
  ANDROID_LOG_INFO,
  /** Warning logging. For use with recoverable failures. */
  ANDROID_LOG_WARN,
  /** Error logging. For use with unrecoverable failures. */
  ANDROID_LOG_ERROR,
  /** Fatal logging. For use when aborting. */
  ANDROID_LOG_FATAL,
  /** For internal use only.  */
  ANDROID_LOG_SILENT, /* only for SetMinPriority(); must be last */
} android_LogPriority;

要想使用此函数我们还需要链接库liblog.so,需要在Android.mk中配置:

LOCAL_LDLIBS += -llog

下面我们看个具体的例子:
修改之前的Test.cpp,内容如下:

#include <jni.h>
#include <android/log.h>
jint cv1(JNIEnv *env, jobject thiz, jbyte p1, jchar p2, jshort p3, jint p4, jlong p5, jstring p6, jobject p7) {
    __android_log_print(ANDROID_LOG_DEBUG, "MD_DEBUG", "run at %s:%s:%d", __FILE__,__FUNCTION__, __LINE__);
    return 3;
}

jint cv2(JNIEnv *env, jclass cls, jbyte p1, jchar p2, jshort p3, jint p4, jlong p5, jstring p6, jobject p7) {
    __android_log_print(ANDROID_LOG_DEBUG, "MD_DEBUG", "run at %s:%s:%d", __FILE__,__FUNCTION__, __LINE__);
    return 4;
}

jint JNI_OnLoad(JavaVM *vm, void *reserved) {
    JNIEnv *env;
    vm->GetEnv((void**)&env,JNI_VERSION_1_4);

    jclass classTest = env->FindClass("com/example/hello_jni/Test");
    JNINativeMethod methods[]= {
            {"connectV1", "(BCSIJLjava/lang/String;Landroid/graphics/Bitmap;)I", (void*)cv1},
            {"connectV2", "(BCSIJLjava/lang/String;Landroid/graphics/Bitmap;)I", (void*)cv2},
    };
    env->RegisterNatives(classTest, methods, sizeof(methods)/sizeof(JNINativeMethod));
    return JNI_VERSION_1_4;
}

修改Android.mk,链接一下liblog.so:

LOCAL_LDLIBS += -llog

编译运行,效果如下图所示:
在这里插入图片描述

下一篇 深入浅出Android NDK之JNI字符串转换

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值