内容简介:我们可以在c/cpp代码中用生成好的项目会在很简单,只需要在
我们可以在c/cpp代码中用 print 函数输出log信息,但是这样在 logcat并 不会显示,好在Android已经给我提供了相应的方法解决这个问题:使用 log.h 头文件
开始
- 创建一个新的Android Studio的工程项目
- 勾选 Include C++ support 选项
- 然后就是一路next直到创建项目成功
项目结构
生成好的项目会在 main 目录下创建好 cpp 目录和相应的cpp文件,以及 CmakeLists 文件
CmakeLists
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
# 限定cmake支持最低版本
cmake_minimum_required(VERSION 3.4.1)
# 指定so生成到libs目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI})
# 配置so库的信息
add_library( # Sets the name of the library.
# 生成的so库名称,并不需要和c/cpp文件名相同
# 这里生产的so库名称将为libnative-lib.so
native-lib
# Sets the library as a shared library.
# STATIC:静态库,是目标文件的归档文件,在链接其它目标的时候使用
# SHARED:动态库,会被动态链接,在运行时被加载
# MODULE:模块库,是不会被链接到其它目标中的插件,但是可能会在运行时使用dlopen-系列的函数动态链接
SHARED
# Provides a relative path to your source file(s).
# 资源文件的路径,可以是多个资源文件
src/main/cpp/native-lib.cpp )
# 从系统库中查找依赖库
find_library( # Sets the name of the path variable.
# 设置依赖库的名字,下面链接库的时候会用到
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
# 查找log依赖库
# {sdk-path}/ndk-bundle/sysroot/usr/include/android/log.h
log )
# 配置库的依赖关系(链接关系)
target_link_libraries( # Specifies the target library.
# 目标库
native-lib
# Links the target library to the log library
# included in the NDK.
# 依赖库,可以是多个
${log-lib} )
复制代码
native-lib.cpp
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring
JNICALL
Java_com_simple_nativelogdemo_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++ hhahah";
return env->NewStringUTF(hello.c_str());
}
复制代码
app/build.gradle下的android节点块
android {
compileSdkVersion 27
defaultConfig {
applicationId "com.simple.nativelogdemo"
minSdkVersion 16
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ""
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
复制代码
完善代码
很简单,只需要在 cpp 文件中引入 log.h 头文件并调用相关方法即可
#include <jni.h>
#include <string>
//{sdk-path}/ndk-bundle/sysroot/usr/include/android
#include <android/log.h>
//定义输出的TAG
const char * LOG_TGA = "LOG_TGA";
extern "C" JNIEXPORT jstring
JNICALL
Java_com_simple_nativelogdemo_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++ hhahah";
//输出debug级别的日志信息
__android_log_print(ANDROID_LOG_DEBUG, LOG_TGA, "hello native log");
return env->NewStringUTF(hello.c_str());
}
复制代码
输出
log.h头文件分析
常用输出函数
/**
* 输出一个简单的字符串作为log信息
*/
int __android_log_write(int prio, const char* tag, const char* text);
/**
* 输出一个格式化的字符串作为log信息
*/
int __android_log_print(int prio, const char* tag, const char* fmt, ...)
/**
* 与`__android_log_print`方式相同,区别只是传递参数不同
*/
int __android_log_vprint(int prio, const char* tag, const char* fmt, va_list ap)
/**
* 用于记录断点失败,类型为`ANDROID_LOG_FATAL`
*/
void __android_log_assert(const char* cond, const char* tag, const char* fmt,
...)
复制代码
参数 prio 代表日志级别
日志级别类型
typedef enum android_LogPriority {
/** For internal use only. */
ANDROID_LOG_UNKNOWN = 0,
/** The default priority, for internal use only. */
ANDROID_LOG_DEFAULT, /* only for SetMinPriority() */
/** Verbose logging. Should typically be disabled for a release apk. */
ANDROID_LOG_VERBOSE,
/** Debug logging. Should typically be disabled for a release apk. */
ANDROID_LOG_DEBUG,
/** Informational logging. Should typically be disabled for a release apk. */
ANDROID_LOG_INFO,
/** Warning logging. For use with recoverable failures. */
ANDROID_LOG_WARN,
/** Error logging. For use with unrecoverable failures. */
ANDROID_LOG_ERROR,
/** Fatal logging. For use when aborting. */
ANDROID_LOG_FATAL,
/** For internal use only. */
ANDROID_LOG_SILENT, /* only for SetMinPriority(); must be last */
} android_LogPriority;
复制代码
我们只需要关注其中的
- ANDROID_LOG_VERBOSE
- ANDROID_LOG_DEBUG
- ANDROID_LOG_INFO
- ANDROID_LOG_WARN
- ANDROID_LOG_ERROR
这5个就好了,因为这是我们常用的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
A=B
Marko Petkovsek、Herbert S. Wilf、Doron Zeilberger / AK Peters, Ltd. / 1996-01 / USD 49.00
At some point, this book describes methods of solving the problem raised by Donald E. Knuth in the classical book "The Art of Computer Programming, Volume 1: Fundamental Algorithms". The main purpo......一起来看看 《A=B》 这本书的介绍吧!