文档章节

NDK开发基础①使用Android Studio编写NDK

逝我
 逝我
发布于 2016/09/22 10:38
字数 1267
阅读 37
收藏 1

接续上个系列之 [ JNI开发系列 ]

JNI开发系列①JNI概念及开发流程

JNI开发系列②.h头文件分析

JNI开发系列③C语言调用Java字段与方法

JNI开发系列④C语言调用构造方法

JNI开发系列⑤对象引用的处理

前情提要

上个系列,我们学习了Java与C/C++的交互 , 使用Java调用C/C++函数,使用C/C++调Java的方法和创建Java对象等等 。在上个系列中 , 我们使用的是Eclipse与VS进行的开发 , 因为延续的是C语言基础系列的做法 , 所以开发工具未作切换 。 在NDK系列中 , 我们将采用最新的Android Studio进行开发 , 版本是Android studio 2.2 RC 2 , NDK版本采用的是最新的r12b

开发环境

工具下载地址 (win)(需要科学上网) : Android Studio 2.2 RC2 --- Android Studio Download 2.2 RC2 Android NDK r12b --- Android NDK r12b 64bit Android NDK r12b --- Android NDK r12b 32bit

国内镜像站: androiddevtools

关于开发环境的说明

因为在Android studio 2.2之前的版本 , 对C/C++支持不是很好 , 也没有语法提示 , 写起来不是很方便 , 构建工具也不是很完整 , 所有采用最新的Android studio 2.2 RC2来进行编写 ,但 , Android studio 2.2 RC2 还是Beta版本 ,所有 , 不建议现在应用到生产环境中 , 等google发布了Stable版本之后再应用 。 目前建议 , 可以使用Eclipse编写.so , 然后应用到现在的生产环境中 。

创建NDK项目

第一步 , 创建支持C++的项目

C++ support

其他的选项使用默认的即可 。

第二步 , 关联NDK

创建完成之后会报如下错误:

ndk r12b

在项目配置中 , 关联NDK之后就会ok

config ndk

第三步 , 编写native类及处理方法

在创建项目的时候 , 勾选了C++ support , 项目创建完成之后 , 会自动帮我们生成一个cpp/native-lib.cpp

auto create cpp file

你可以不用修改文件名 , 在新建native方法的时候 , 会提示你创建一个C++的JNI函数 , 直接创建就会生成一个JNI函数 , 都不用使用javah生成一个头文件 , 然后再引入头文件了 , 非常之方便 。

auto create jni function 1

创建函数:

auto create jni function 2

在这里 , 就不使用默认的.cpp文件了 , 我们新建一个.c文件 , 创建了HelloNDK.c文件之后 , Android Studio会提示我们 , 需要在Android.mk/CMakeLists.txt中进行声明 , 这里 , 我们使用默认的CMakeLists.txt建构工具 (创建项目的时候自动生成)。

第四步 , build.gradle配置:

externalNativeBuild {  
  cmake {       
     cppFlags ""       
     // 指定只用clang编译器        
    // Clang是一个C语言、Objective-C、C++语言的轻量级编译器。  
    arguments "-DANDROID_TOOLCHAIN=clang"        
    // 生成.so库的目标平台        
    abiFilters "armeabi-v7a" , "armeabi"    
    }
}

// 配置CMakeLists.txt路径
externalNativeBuild { 
   cmake {        
      path "CMakeLists.txt"   
   }
}

第五步 , 修改CMakeLists.txt

add_library( # Sets the name of the library.
             HelloNDK  # 生成的.so库文件名称

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             # Associated headers in the same location as their source
             # file are automatically included.
             # 需要生成的.so库的文件路径
             src/main/cpp/HelloNDK.c
 )

target_link_libraries( # Specifies the target library.
                       # 项目链接的.so库名称
                       HelloNDK

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

第六步 , 编写native方法,以及C函数

/**
 * Created by Zeno on 2016/9/10.
 *
 * NDK Demo
 */

public class HelloNDK {

    public static native String sayHelloNDK() ;

    static {
        System.loadLibrary("HelloNDK");
    }
}

#include <jni.h>
JNIEXPORT jstring JNICALLJava_com_zeno_encryptanddecrypt_ndk_HelloNDK_sayHelloNDK(JNIEnv *env, jclass thiz) {   
     // TODO    
     return (*env)->NewStringUTF(env, "this String come from C ");
}

native方法的编写以及C函数的写法, 我们都非常熟悉了 , 这里就不再解释各自的意义了 。

第七步 , 编译

make

编译完成之后 ,我们可以切换到project视图,来查看.so文件

make success

第八步 , 运行

run

如果使用的是genymotion模拟器 , 这需要在abiFilters加入x86 ,不然项目会运行不起来的 。 当然, 也可以使用一个genymotion的arm插件 , 这样不配置x86也可以运行 。

// 生成.so库的目标平台
abiFilters "armeabi-v7a" , "armeabi" , "x86"

结语

做为Android开发者 , 从最开始的Eclipse开发工具 , 到现在日渐成熟的Android Studio , 还有几乎可以看得见成长的Android System , 我很庆幸 , 从一开始就选择了Android平台 , 从初学Android到现在的日渐深入 , Android在成长 , 我也在成长 。见证了Android从一个丑小鸭变成了 , 一个羽翼渐丰的白天鹅 , 不论从操作系统的易用性和UI友好性 , 它的成长都是有目共睹的 。感谢Android 。

每一个人的成长背后 , 都离不开所有人支持 , 我们是一个单独的个体 , 又是社会网状结构的一个点 , 我们既独立又互相联系 。 本文由动脑学院特约赞助 , 祝各位老司机节日快乐 !

关于Android Studio 2.2

我很期待这个版本 , 对于C/C++的支持非常友好 , 省却了很多繁琐的操作 , 比Eclipse好用的太多 。

参考

Building C++ in Android Studio with CMake or ndk-build

© 著作权归作者所有

逝我
粉丝 4
博文 20
码字总数 31426
作品 0
长沙
程序员
私信 提问
Cocos2d-x 3.4在AndroidStudio上编译配置

1.准备好以下文件   1) AndroidStudio: https://dl.google.com/dl/android/studio/install/1.1.0/android-studio-bundle-135.1740770-windows.exe   2) NDK:https://dl.google.com/and......

simpower
2015/07/31
0
0
Android Studio 使用NDK开发

Android Studio 使用NDK编程 使用Android Studio有半年多了,感觉很好用,不就感觉费劲的就是NDK的支持一直不是很好,再Bate版的时候好像0.4.x之前可以使用NDK,当然本身Android Studio本身是...

HaidyCao
2014/12/21
0
17
Android Studio之NDK环境搭建,so文件打包以及使用

本篇入门教程开发环境为mac + Android Studio + gradle 2.14.1,主要包含以下3块内容: NDK环境搭建 编写第一个JNI项目 打包出动态so文件,在其他项目中使用 一、NDK环境搭建 从Android Stu...

ljianbing
2018/06/26
0
0
cocos2d-x 3.0 final 环境搭起来,demo跑起来

Cocos2d-x相关软件版本及下载 使用cocos2dx3.0的正式版:http://www.cocos2d-x.org/download 使用apache-ant-1.9.3 :http://ant.apache.org/bindownload.cgi 使用python2.7.6 :https://www......

cardinalinux
2014/05/19
0
0
使用Android Studio开发FFmpeg的正确姿势

原文地址:https://www.jianshu.com/p/0a7f3175c1b9 2018-04-21: 更新至 ffmpeg-4.0 使用AndroidStudio 开发 FFmpeg Keywords: gradle, cmake 关键步骤,编译FFmpeg,Android Studio 集成。 ......

炎林2018
2018/11/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

非webpack require.js + vue + vueRouter + iView 实现按需加载

适合一个人开发的时候,在整个php框架下,又想单页,又可以直接后端assign变量穿透到模板。又不想写接口搞前后分离脚手架一大堆npm 包, 在php模板下 引入require.js <!DOCTYPE html><html...

一箭落旄头
22分钟前
7
0
新特性解读 | MySQL 8.0 窗口函数详解

原创作者: 杨涛涛 背景 一直以来,MySQL 只有针对聚合函数的汇总类功能,比如MAX, AVG 等,没有从 SQL 层针对聚合类每组展开处理的功能。不过 MySQL 开放了 UDF 接口,可以用 C 来自己写UDF...

爱可生
28分钟前
3
0
23.5 jumpserver介绍

23.5 jumpserver介绍 开源堡垒机jumpserver介绍: 官网www.jumpserver.org Jumpserver是一款使用Python, Django开发的开源跳板机系统, 助力互联网企业高效 用户、资产、权限、审计 管理 Auth...

oschina130111
34分钟前
4
0
Spring Cloud 入门教程(七): 消息总线(Spring Cloud Bus)(Greenwich.RELEASE)

参考网址:https://blog.csdn.net/forezp/article/details/81041062,由于此文中作者基于git和rabbitMq,为了适应内网我改造为基于mysql和kafka 一、准备工作 1、安装kafka 参考这个:kafka...

pipi1919
35分钟前
3
0
用人工智能改变企业与客户的连接方式

  随着以AI人工智能技术为主的新一代信息技术的快速商业化落地,我国的数字经济正高歌猛进。2017年我国数字经济对GDP的贡献率为55%,接近甚至超越了某些发达国家水平,2018年我国数字经济规...

琴殇的
39分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部