Android studio NDK成长记录(五)将C中的Log打到Logcat

在Android studio中编写C代码时,如果想用printf()方法打印log进行调试,正常情况下不能像VS2015那样或者像Android中那样打印到logcat上,所以需要一定的配置对ndk-bundle\platforms\android-16\arch-arm\usr\lib中的liblog.so进行调用来打印log。
具体方法如下:下面的代码不能直接全抄,谨慎抄写!

  1. 需要在c源文件所在module中的build.gradle中配置libLog属性
    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.0"
    
        defaultConfig {
            minSdkVersion 15
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
    
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    
            ndk {
                //配置该属性用于在C源文件中打印log到studio的控制台              
                ldLibs "log"     
            
                //该属性为生成的so库的名字为lib+'moduleName'+.so
                moduleName "native_jni"
            }
    
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
        externalNativeBuild {
            ndkBuild {
                path 'Android.mk'
            }
        }
    }
  2. 在C源文件中进行如下定义和导库
    //需要导入log.h这个库
    #include <android/log.h> 
    
    //定义Log标志
    #define LOG_TAG "Dragon_C"
    
    //定义宏,打印的方法是在log.h中,调用log.h中对应的方法来打log,logD对应log.d,logI对应log.i,logE对应log.e 
    #define LogD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
    #define LogI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
    #define LogE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
    
    JNIEXPORT jint JNICALL Java_com_picovr_javacall_NativeMethord_addNumberCallback
            (JNIEnv *env, jobject jobj) {
    
        //1.得到字节码
        //jclass      (*FindClass)(JNIEnv*, const char*);
        jclass jclass1 = (*env)->FindClass(env, "com/picovr/javacall/NativeMethord");
    
        //2.得到方法ID
        //jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
        jmethodID jmethodID1 = (*env)->GetMethodID(env, jclass1, "add_number",
                                                   "(II)I");//倒数第一个参数:方法签名,倒数第二个参数:方法名
    
        //3.实例化类
        //jobject     (*AllocObject)(JNIEnv*, jclass);
        jobject jobject1 = (*env)->AllocObject(env, jclass1);
    
        //调用方法
        //jint        (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);
        jint result = (*env)->CallIntMethod(env, jobject1, jmethodID1, 20, 30);
        LogI("result :%d", result);
    }
发布了34 篇原创文章 · 获赞 23 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章