android ndk 入门3 - log实现

新建工程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 __cplusplus
extern "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-log
LOCAL_SRC_FILES := main.cpp
include $(BUILD_SHARED_LIBRARY)


运行:

android ndk 入门3 - log实现_第1张图片

#####################################################################


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,android,NDK,NDK)