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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章