zoukankan      html  css  js  c++  java
  • Andriod学习笔记5:通过NDK在C++中实现日志输出

    开发环境

    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
    
  • 相关阅读:
    Vue 错误:Avoid mutating a prop directly
    插入排序
    Vue2.0实现ie的兼容
    mysql8.0遇到删除外键的错误
    c# 根据父节点id,找到所有的子节点数据
    SSH原理与运用(一):远程登录
    Java线程:Timer和TimerTask
    linux系统判断是否重启、关机、查询登录诊断分析简介
    CS架构和BS架构的区别
    yum提示another app is currently holding the yum lock;waiting for it to exit
  • 原文地址:https://www.cnblogs.com/imfanqi/p/5218490.html
Copyright © 2011-2022 走看看