使用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" /> |