您的位置:首页 > 移动开发 > Android开发

android ndk 入门3 - log实现

2015-11-26 10:12 519 查看
新建工程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)


运行:



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

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"
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: