文档章节

Android studio NDK成长记录(一)CMake

风哲
 风哲
发布于 2017/01/19 15:34
字数 1373
阅读 288
收藏 1

Android studio NDK开发支持CMake和ndk-build两种编译方式:

第一种:CMake编译方式的开发步骤

  1. 下载安装studio     下载地址:“http://www.android-studio.org/
  2. 新建项目
  3. 下载安装ndk插件:File右键->setting->Android SDK->SDK Tool勾选CMake,LLDB,NDK,将这三个插件全都安装上。
  4. 查看是否关联上NDK,也可以手动添加(local.properties末尾加上如下代码)
    //这是自己的ndk地址,注意转义,下面的地址本来是"E:\Android\SDK\ndk-bundle"
    ndk.dir=E\:\\Android\\sdk\\ndk-bundle
  5. gradle.properties文件末尾添加代码"android.useDeprecatedNdk=true"(为了适配低版本)
  6. 在module(如app:)目录下创建一个CMake的配置文件(CMakeLists.txt,必须是这个名字,这个文件是用于关联上gradle和CMake的),必须配置以下几个基本属性,如有需要并熟悉CMake语法,可自行酌情增加,可参考下面CMakeLists.txt的配置。(也可以在创建项目的时候勾选上support c++,studio就会自动创建该文件,并配置好gradle,并且会在MainActivity中生成一个native方法,创建一个cpp文件,和一个native-lib.cpp文件。这时候只需要去修改CMakeLists.txt中的参数,并且删除cpp中自动生成的cpp文件,改成自己想要的就行。
    #CMakeLists.txt配置内容如下
    #版本
    cmake_minimum_required(VERSION 3.4.1)
    
    add_library( 
                # 决定编译出来的so库的名称(这个配置文件得到的是libhello.so).
                 hello
                 # 动态 这样studio会将so库打包到你的apk中
                 SHARED  
                 #c文件的地址,若有多个文件,直接一一列出,以空格或者换行隔开       
                 src/main/cpp/hello.c src/main/cpp/test.c)
    
    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 )
    
    target_link_libraries( # Specifies the target library.
                           hello
    
                           # Links the target library to the log library
                           # included in the NDK.
                           ${log-lib} )
  7. 关联CMake和gradle,配置这个的主要原因是为了让studio在编译的时候能找到你的资源文。
    有两种方式:有的同学不一定Link C++ Project with Gradle选项,就用第二种
    (1)自动关联,将工程改为Android视图,右键选中module(如app),选择Link C++ Project with Gradle,下拉选项中选择CMake,浏览找到你的项目中的CMakeLists.txt文件。(2.)手动关联,在module(如app)下的build.gradle中做如下配置externalNativeBuild属性
    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.0"
        defaultConfig {
            applicationId "com.picovr.ndksupporttest"
            minSdkVersion 15
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
            externalNativeBuild {
                cmake {
                    cppFlags "-frtti -fexceptions"  }
            }
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
        externalNativeBuild {
            cmake {
                path "CMakeLists.txt"  }
        }
    }
  8. 创建一个java类,在里面申明一个native方法
    package com.picovr.ndksupporttest.mynative;
    
    /**
     * Created by PICO-USER Dragon on 2017/1/17.
     */
    
    public class JNI {
        public static native String getString();
    }
  9. 创建.c或者cpp源文件,和头文件。(下面以c语言为例)
    第一种方式:
    在mian目录下新建cpp文件夹。
    选中Android Studio的左下角Terminal面板,输入命令“cd app/src/main/java”进入java目录,执行命令“javah 包名+类名“,这个命令是调用jdk中的javah.exe程序对native方法所在的Java类生成一个对应的.h头文件。这种方式生成的.h头文件中,自动将native方法在C语言中所对应的方法名全部生成出来了。然后将生成的.h文件剪切到cpp文件夹,并将.h文件中放方法名称copy到c文件中,将参数补全即可。
    生成.h文件的命令如:“javah com.picovr.ndksupporttest.mynative.JNI”
    第二种方式:
    在main目录新建文件夹cpp,右键新建C/C++ Source File 勾选上Create an asscoiated hearder,这样就会生成一个.c文件和.h的头文件,这个.h文件不会像第一种方式那样自动生成native方法在C语言中所对应的方法名,需要自己手动去写。在学习阶段建议手动去做,更好地了解并熟悉jni的一些规则。
    java中的native方法对应C语言中的方法的规则在下面的代码中已经详细解释:
    copy下面的代码的时候,导包hello.h和jni.h分别copy,因为每个人的头文件名字不一样。ndk安装路径也不一样,所以jni.h所在目录不一样。
    /* Created by PICO-USER Dragon on 2017/1/17.
      导包的时候要注意
      1.你自己创建的.h文件必须要
      2.jni.h必须要,这个导包的时候,studio应该会提示,其实就是你安装ndk所在目录下的platforms目录中的任意
      一个版本中,可以在电脑中按照下面jni.h的那个路径中找来看看
     */
    #include "hello.h" #include "../../../../../../Android/SDK/ndk-bundle/platforms/android-21/arch-x86_64/usr/include/jni.h"
    #include <stdio.h>
    #include <stdlib.h>
    /**
     * 命名规则:返回值类型 + 方法名
     * 方法名:Java+包名+类名+方法名,并且把'.'改'_'
     *
     * JNIEXPORTJNICALL 可要可不要string Java_com_picovr_ndksupporttest_mynative_JNI_getString(JN *IEnv *env, jobject jobj)也行
     *
     * jstring 是返回值对应java中的String
     * JNIEnv *env 必须参数,在C中必须要用到这个参数去调用方法
     * jobject jobj 必须参数 不一定用到
     */
    JNIEXPORT jstring JNICALL
    Java_com_picovr_ndksupporttest_mynative_JNI_getString(JNIEnv *env, jobject jobj) {
    
        //jstring     (*NewStringUTF)(JNIEnv*, const char*);其实是在调用ndk-build中的jni.h中的方法
        return (*env)->NewStringUTF(env, "The first jinDemo for Dragon !");
    
    }
  10. 加载动态链接库
    在native方法所在类中增加静态代码块,加载动态链接库
    package com.picovr.ndksupporttest.mynative;
    
    /**
     * Created by PICO-USER on 2017/1/17.
     */
    
    public class JNI {
    
        // Used to load the 'native-lib' library on application startup.
        static {
            //"hello"是so库的名字,也就是CMakeLists.txt文件中add_library()属性中的第一个参数
            System.loadLibrary("hello");
        }
    
        public static native String getString();
    
    }
  11. 调用native方法getstring()。看看是否能成功调用。

 

 

© 著作权归作者所有

共有 人打赏支持
风哲
粉丝 0
博文 13
码字总数 12513
作品 0
海淀
私信 提问
Android JNI学习(二)——实战JNI之“hello world”

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头
2018/05/09
0
0
Android:随笔——新的 NDK/JNI 调用方式

转载请标明地址 QuincySx: http://www.jianshu.com/p/c6108131ba0f 众所周知现在 Android 开发已经到了 Android Studio 的时代,那么 JNI 的调用方式也经过了好几代 在eclipse 时代就存在的...

quincy
2017/04/05
0
0
一篇好文之Android 调用C代码及生成调试so库

版权声明:本文为博主原创文章,转载请声明。 https://blog.csdn.net/qq_32175491/article/details/83588167 不靠谱的朱先生又来了,今天是周五,我又出现了!好了,不为自己多解释,上周没发...

aserbao
2018/11/02
0
0
Android Studio向项目添加C/C++原生代码教程

原文:http://www.cnblogs.com/lsdb/p/9337285.html 说明:本文相当于官方文档的个人重新实现,官方文档链接:https://developer.android.com/studio/projects/add-native-code 向项目添加C...

炎林2018
01/21
0
0
最新靠谱可用的 Mac 环境下 FFmpeg 环境搭建

大家好,我是光源。 最近在尝试搭建 FFmpeg 开发环境时遇到一个蛋疼的事,Google 了 N 篇文章竟然没有一篇是可以跑起来的! 少部分教程是给出了自我矛盾的配置(是的,按照贴出来的代码和配置...

光源_Android
2018/05/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

创建多个git账号

实习开发中我们可能一个机子上配置多个git账号,如github.com,oschina.com 或者工作账号,私人账号,这时候就2个账号用一个key,肯定会冲突,有一个会提示没权限(账号和密码对应不上) ssh ...

echojson
26分钟前
0
0
rabbitmq安装教程

RabbitMQ有Windows与Linux版本的,这里先写Windows版本的安装。 以前安装软件总是在百度上找某某安装教程,结果能按照教程安装好的软件真的不多。想起先前以为大牛说的一句话,去官网按照官网...

em_aaron
今天
7
0
Android 贝塞尔曲线实践——波浪式运动

一、波浪效果如下 贝塞尔曲线自定义波浪效果的案例很多,同样方法也很简单,大多数和本案例一样使用二次贝塞尔曲线实现,同样还有一种是PathMeasure的方式,这里我们后续补充,先来看贝塞尔曲...

IamOkay
今天
3
0
Nmap之防火墙/IDS逃逸

选项 解释 -f 报文分段 --mtu 指定偏移大小 -D IP欺骗 -sI 原地址欺骗 --source-port 源端口欺骗 --data-length 指定发包长度 --randomize-hosts 目标主机随机排序 --spoof-mac Mac地址欺骗 ...

Frost729
今天
2
0
带你搭一个SpringBoot+SpringData JPA的环境

不知道大家对SpringBoot和Spring Data JPA了解多少,如果你已经学过Spring和Hibernate的话,那么SpringBoot和SpringData JPA可以分分钟上手的。 其实我在学完SpringBoot和SpringData JPA了之...

java菜分享
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部