在Android studio中編寫C代碼時,如果想用printf()方法打印log進行調試,正常情況下不能像VS2015那樣或者像Android中那樣打印到logcat上,所以需要一定的配置對ndk-bundle\platforms\android-16\arch-arm\usr\lib中的liblog.so進行調用來打印log。
具體方法如下:下面的代碼不能直接全抄,謹慎抄寫!
- 需要在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' } } }
- 在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); }