[jni] 05_如何使在c代码中使用log在android的logcat打印日志信息

Android 4.0

使用Log调试C代码

1、在C代码中引入系统头文件和其他信息
#include <android/log.h>   //C:\android-ndk-r9b\platforms\android-16\arch-arm\usr\include\android\log.h
#define LOG_TAG "System.out.c" //在LogCat上打印出来的Tag
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
2、在Android.mk文件中加入LOCAL_LDLIBS += -llog
#引用头文件,C:\android-ndk-r9b\platforms\android-16\arch-arm\usr\lib\liblog.so -l表示引入一个库,后面接库的名字
#要引入libOpenSLES.so,写LOCAL_LDLIBS += -lOpenSLES
LOCAL_LDLIBS += -llog
注意:
 加入的LOCAL_LDLIBS += -llog  要在include $(BUILD_SHARED_LIBRARY)之前,如果放在后面,
在使用cygwin编译c代码的时候,会报错error: undefined reference to '__android_log_print'
3、然后在C代码中使用
LOGI("info\n");
LOGD("debug\n");
4、核心代码:C代码
#include <stdio.h>
#include <jni.h>
#include <malloc.h>

#include "cn_zengfansheng_ndkhelloworld_DemoActivity.h"
#include <android/log.h>   //C:\android-ndk-r9b\platforms\android-16\arch-arm\usr\include\android\log.h
#define LOG_TAG "System.out.c" //在LogCat上打印出来的Tag
#define LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...)  __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

jstring Java_cn_zengfansheng_ndkhelloworld_DemoActivity_helloFromJNI(
        JNIEnv * env, jobject obj) {
    LOGI("method called");
    LOGI("ARRAY init");
    char* a1 = (char*) malloc(sizeof(char)*10);
    *a1 = 'a';
    *(a1+1) = 'b';
    *(a1+2) = 'c';
    *(a1+9) ='\0';
    LOGI("a1 = %s",a1);
    char a2[2] ={'e','f'};
    LOGI("ARRAY init finish");
    LOGI("copy array");
    strcat(a1,a2); // 把a2的内容 放到a1的后面 要求a1的大小必须> a1+a2
    LOGI("a1  end = %s",a1);
    LOGI("copy array end");
    return (*(*env)).NewStringUTF(env, "hello from c javah");
}
注意:c代码中的log不支持中文
5、结果:

问题1:使用Log时,在添加LOCAL_LDLIBS += -llog 时,如果将其放在了include $(BUILD_SHARED_LIBRARY)后面,就会报下面的错误 
error: undefined reference to '__android_log_print'
解决:LOCAL_LDLIBS += -llog放在include $(BUILD_SHARED_LIBRARY)的下面
问题2:Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 16 in /cygdrive/f/02_Android/android4_0_project/Ndkhelloworld/AndroidManifest.xml
解决:在清单文件中,将android:minSdkVersion与当前平台的版本改成一致
<uses-sdk
        android:minSdkVersion="19"
        android:targetSdkVersion="19" />