在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); }