开发环境

  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. thinkphp5.0分页

    第一种 public function index(){ // 页面和面包屑导航 $ttl[] = $this->title; $ttl[] = '管理员列表'; $this->assig ...

  2. ECSHOP 商品字段增加新字段的方法

    结合ecshop后台“商品编辑”.“商品录入”来谈谈如何给ecshop商品增加一个新字段,假设我们将这个新字段命名为 new_add 1.首先要修改数据表结构,给表 ecs_goods 增加新字段:n ...

  3. 如何查看/统计当前AD域控制器的活动用户?

    最近公司想知道某台AD域控制器上当前连接了多少活动用户? 此前个人只知道以下不是非常完善且统计起来比较麻烦的方法: 方法1:查看共享会话数.(不完全准确) 方法2:查看当前的DNS记录.(这种方法统计 ...

  4. Ubuntu Server 14.04 集成

    方便工作出差显示项目整合了下平时常用软件: OS: Ubuntu Server 14.04 VM:VMware Workstation 12.1.0 (不同版本好像会不兼容) 已经安装软件: 1. s ...

  5. spring 静态注入

    1.静态注入 在setter 方法修改为非 static , 然后在上面注入即可 @Component public class WeixinConfig { // token public stat ...

  6. 如何做出透明背景的flash动画

    最近碰到了一个问题,做动画时怎么设置透明背景,字是白色的,网上搜了一下,发现可以这样做 在插入的flash代码中加入这一行代码就可以实现了 <param name="wmode&quo ...

  7. awk命令和grep命令的使用

    1.遇到需求:用ping命令去检测系统网络延迟 跑 ping baidu.com -c 3,想要直接得到平均延迟. ping baidu.com -c 3 | grep rtt | awk -F \/ ...

  8. ComboBox,三级联动菜单,新入门点小白,有些代码有待优化,大神勿喷

    //当前窗体的Load事件 private void provinceANDCity_Load(object sender, EventArgs e) { //连接字符串 string strConn ...

  9. filter : progid:DXImageTransform.Microsoft.AlphaImageLoader ( enabled=bEnabled , sizingMethod=sSize , src=sURL )

    很多时候需要将图片显示在网页上,一般都会这样做,如下: <img src="xxx.jpg"/> 是的,这样是可以做到,但是如果我要将本地的图片显示到页面上呢?你可能会 ...

  10. nginx windows负载均衡入门

    前言 做了几年开发,都是只管码代码,没有参与过项目的部署,为了知识体系更加完整,于是开始学习一下负载均衡.查了一下资料,觉得用nginx +iis 比较简单,于是小试牛刀. 步骤 准备工作 下载ngi ...