开发环境

  1. android studio 1.5.1

实现步骤

  1. 新建android项目

    项目名称为AndroidCLog,选择Empty Activity模板,其他默认即可。

  2. 下载配置ndk

    在项目上右键选择“Open Module Setting”,在弹出窗口中选择“SDK Location”,我们会看到Android NDK location,如果之前没有配置的话,这里会是空的。

    有两种下载方法:

    1. 点击下边的Download,由Android Studio自行下载配置安装
    2. 官网下载并解压,然后再这里配置NDK的路径。
  3. 添加JNI目录

    在工程目录上右键选择New -> Folder -> JNI Folder,其他默认即可。

  4. 新建一个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。

  1. 在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);
}
  1. 在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"'。

  1. 在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>
  1. 在MainActivity.java中增加输出日志的代码
JNIBridge.logI("this is a log from cpp");
  1. 运行应用程序,并找到输出的日志
02-26 08:04:53.198 2507-2507/? I/OUTPUT: this is a log from cpp

Andriod学习笔记5:通过NDK在C++中实现日志输出的更多相关文章

  1. shell编程学习笔记(四):Shell中转义字符的输出

    通过echo可以输出字符串,下面看一下怎么输出特殊转义字符,首先我先列出来echo的转义字符: \\ 输入\ \a 输出警告音 \b 退格,即向左删除一个字符 \c 取消输出行末的换行符,和-n选项一 ...

  2. Andriod学习笔记 - 参考

    Andriod学习笔记 - 参考 自定义实现圆形播放进度条(android,飞一般的感觉) 盘点Android开发者必备的十大开发工具

  3. Vue.js学习笔记:在元素 和 template 中使用 v-if 指令

    f 指令 语法比较简单,直接上代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...

  4. C# 动态生成word文档 [C#学习笔记3]关于Main(string[ ] args)中args命令行参数 实现DataTables搜索框查询结果高亮显示 二维码神器QRCoder Asp.net MVC 中 CodeFirst 开发模式实例

    C# 动态生成word文档 本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-- ...

  5. 【Ext.Net学习笔记】04:Ext.Net中使用数据、Ext.Net Store的用法、Ext.Net ComboBox用法

    之前的几篇文章都是介绍Ext.Net较为基础的东西,今天的这一篇将介绍数据的一些用法,包括XTemplate绑定数据.Store(Modal.Proxy).ComboBox的用法等. XTemplat ...

  6. [C#学习笔记3]关于Main(string[ ] args)中args命令行参数

    Main(string[] args)方法是C#程序的入口,程序从这里开始执行,在这里结束.C#代码逻辑要包含在一个类型(Type)中,游离的.全局的变量或函数是不存在的,这里的类型包括类(class ...

  7. JNI学习笔记_Java调用C —— 非Android中使用的方法

    一.学习笔记 1.java源码中的JNI函数本机方法声明必须使用native修饰. 2.相对反编译 Java 的 class 字节码文件来说,反汇编.so动态库来分析程序的逻辑要复杂得多,为了应用的安 ...

  8. Andriod学习笔记1:代码优化总结1

    多行变一行 比如说开发一个简单的计算器应用程序,需要定义0-9的数字按钮,第一次就习惯性地写出了如下代码: Button btn0; Button btn1; Button btn2; Button ...

  9. Android学习笔记—Windows下NDK开发简单示例

    该示例假设Android开发环境已经搭建完成,NDK也配置成功: 1.在Eclipse上新建Android工程,名称为ndkdemo.修改res\layout\activity_main.xml &l ...

随机推荐

  1. 深入分析HTTP状态码502(nginx+php-fpm)

    我们的一个web项目,由于新上城市增多,导致访问量增大,DB压力增大,作为提供接口的业务方,最近被下游反馈大量请求"502". 502,bad gateway,一般都是upstre ...

  2. NancyFX 简介

    Nancy是.NET 平台的微框架.在受到Ruby社区的Sinatra框架启发下,NancyFx框架提供一个.NET平台下的低门槛.易上手的可用于Web开发工具包. 请注意我说的是可用于Web开发,这 ...

  3. js自动轮播图片的两种循环方法(原创)

    用5个div,布局从左到右5张图片,从左到右5个div分别指定ID为img1,img2,img3,img4,img5.(背景是relative,5个div是相对于背景absolute定位) 显示如下: ...

  4. jQuery 人脸识别插件,支持图片和视频

    jQuery Face Detection 是一款人脸检测插件,能够检测到图片,视频和画布中的人脸坐标.它跟踪人脸并输出人脸模型的坐标位置为一个数组.我们相信,面部识别技术能够给我们的 Web 应用带 ...

  5. hdu2014青年歌手大赛

    Problem Description 青年歌手大奖赛中,评委会给参赛选手打分.选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分. Input 输入数据有多组,每组占 ...

  6. 布局TextView和EditText区别,layout_width和lay_weight区别--Android Studio

    1. TextView控件是文本表示控件,主要功能是向用户展示文本的内容,它是不可编辑的,如设置标题:EditText控件是编辑文本控件,主要功能是让用户输入文本的内容,它是可以编辑的.每一个控件都有 ...

  7. linux sed命令详解

    简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...

  8. 执行mvn 报错 source-1.5 中不支持 diamond运算符

    编译版本出现了问题 <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> < ...

  9. Linq练习

    首先在Program.cs的Main()方法下添加如下代码: string[] names = { "heh", "haha", "huahua&qu ...

  10. Thrift的TBinaryProtocol二进制协议分析

    先上张图,说明一下thrift的二进制协议是什么东东. 报文格式编码: bool类型: 一个字节的类型,两个字节的字段编号,一个字节的值(true:1,false:0). Byte类型: 一个字节的类 ...