android ndk 入门3 - log实现
16lz
2021-12-04
新建工程NDKTest2,新建活动MainActivity
修改local.properties,加入ndk路径
ndk.dir=$$
修改gradle.properties,加入:
android.useDeprecatedNdk=true
新建MyNDK.java:
package com.zj.ndktest2;/** * Created by root on 15-11-25. */public class MyNDK { static { System.loadLibrary("hello-log"); } public static native void HelloLog();}
修改MainActivity.java:
package com.zj.ndktest2;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyNDK.HelloLog(); }}
修改app/build.gradle,添加
android { defaultConfig { ndk { moduleName "hello-log" ldLibs "log" } }}
点击MyNDK.java,右键->External Tools->javah,生成com_zj_ndktest2_MyNDK.h:
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_zj_ndktest2_MyNDK */#ifndef _Included_com_zj_ndktest2_MyNDK#define _Included_com_zj_ndktest2_MyNDK#ifdef __cplusplusextern "C" {#endif/* * Class: com_zj_ndktest2_MyNDK * Method: HelloLog * Signature: ()V */JNIEXPORT void JNICALL Java_com_zj_ndktest2_MyNDK_HelloLog (JNIEnv *, jclass);#ifdef __cplusplus}#endif#endif
新建MyLog.h:
#ifndef _MYLOG_H_#define _MYLOG_H_#include <android/log.h>#define TAG "test"#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)#endif
新建main.cpp:
#include <jni.h>#include "com_zj_ndktest2_MyNDK.h"#include "MyLog.h"#include <android/log.h>JNIEXPORT void JNICALL Java_com_zj_ndktest2_MyNDK_HelloLog (JNIEnv *env, jclass cla) { LOGV("hello verbose"); LOGD("hello debug"); LOGI("hello info"); LOGW("hello warn"); LOGE("hello error");}
新建Android.mk:
LOCAL_PATH := ${call my-dir}include $(CLEAR_VARS)LOCAL_MODULE := hello-logLOCAL_SRC_FILES := main.cppinclude $(BUILD_SHARED_LIBRARY)
#####################################################################
NDK关于日志输出的头文件在
#include <android/log.h>
android/log.h文件可以在$(NDK_HOME)/platforms/android-*/arch-*/usr/include/android里面
关键语句是:
/* * Android log priority values, in ascending priority order. */typedef enum android_LogPriority { ANDROID_LOG_UNKNOWN = 0, ANDROID_LOG_DEFAULT, /* only for SetMinPriority() */ ANDROID_LOG_VERBOSE, ANDROID_LOG_DEBUG, ANDROID_LOG_INFO, ANDROID_LOG_WARN, ANDROID_LOG_ERROR, ANDROID_LOG_FATAL, ANDROID_LOG_SILENT, /* only for SetMinPriority(); must be last */} android_LogPriority;
/* * Send a formatted string to the log, used like printf(fmt,...) */int __android_log_print(int prio, const char *tag, const char *fmt, ...)
可以自定义上述log输出函数,新建MyLog.h:
#ifndef _MYLOG_H_#define _MYLOG_H_#include <android/log.h>#define TAG "test"#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)#endif
以后想要日志输出即可使用
##################################################################33
关于如何添加NDK能够log的方法,在网上找到4种:
1.在Android.mk中加入:
LOCAL_LDLIBS := -llog
注意,上述语句应加在include $(CLEAR_VARS)之后
2.在Android.mk中加入:
LOCAL_LDFLAGS := -llog
3.在Android.mk中加入:
LOCAL_SHARED_LIBRARIES += liblog
4.在app/build.gradle中加入:
android { defaultConfig { ndk { ldLibs "log" } }}
更多相关文章
- android stuido中修改最低sdk
- Android(安卓)系统音量最大值的定义位置以及默认值的修改方法
- Android(安卓)studio怎样隐藏标题栏
- Android(安卓)Unable to find instrumentation target package
- widget入门
- android 设置 源码 修改默认主题为白底黑字
- Android(安卓)USB debugging 功能失效
- 2013.07.22——— android 修改hosts
- 修改不启动Launcher导致开机广播无法发出的bug