Andriod学习笔记5:通过NDK在C++中实现日志输出
开发环境
- android studio 1.5.1
实现步骤
-
新建android项目
项目名称为AndroidCLog,选择Empty Activity模板,其他默认即可。 -
下载配置ndk
在项目上右键选择“Open Module Setting”,在弹出窗口中选择“SDK Location”,我们会看到Android NDK location,如果之前没有配置的话,这里会是空的。
有两种下载方法:- 点击下边的Download,由Android Studio自行下载配置安装
- 在官网下载并解压,然后再这里配置NDK的路径。
-
添加JNI目录
在工程目录上右键选择New -> Folder -> JNI Folder,其他默认即可。 -
新建一个java类,并生成C++的头文件
例如JNIBridge.java:
package xyz.fanqi.androidclog;
public class JNIBridge {
public native static void logI(String msg);
static {
System.loadLibrary("androidclog");
}
}
通过终端命令生成C++头文件
cd AndroidCLog/app/src/main/java
javah -d ../jni/ -jni xyz.fanqi.androidclog.JNIBridge
编译成功之后,在JNI目录中就可以看到C++头文件xyz_fanqi_androidclog_JNIBridge.h。
- 在JNI目录中创建同名C++源文件xyz_fanqi_androidclog_JNIBridge.cpp
#include "xyz_fanqi_androidclog_JNIBridge.h"
#include <android/log.h>
#include <stdio.h>
#define LOG_TAG "OUTPUT"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
void Java_xyz_fanqi_androidclog_JNIBridge_logI
(JNIEnv *env, jclass, jstring jstr){
const char *message=NULL;
message = env->GetStringUTFChars(jstr, 0);
LOGI("%s", message);
}
- 在build.gradle(Module: app)配置文件中添加ndk配置,然后点击右上角的“sync now”同步一下。
defaultConfig {
applicationId "xyz.fanqi.androidclog"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
ndk{
moduleName "androidclog"
abiFilters "x86"
ldLibs "log"
}
}
适配多种CPU架构的方法:abiFilters 后面指定要适配的平台,例如'abiFilters "x86","armeabi"'。
- 在gradle.properties文件中增加一行代码:
android.useDeprecatedNdk=true
解决Error:(14, 0) Error: NDK integration is deprecated in the current plugin.
的问题。
Error:(14, 0) Error: NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin. For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental. Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.
<a href="openFile:/Users/fanqi/AndroidStudioProjects/AndroidCLog/app/build.gradle">Open File</a>
- 在MainActivity.java中增加输出日志的代码
JNIBridge.logI("this is a log from cpp");
- 运行应用程序,并找到输出的日志
02-26 08:04:53.198 2507-2507/? I/OUTPUT: this is a log from cpp