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

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

144 
作者  逝我 
2016.09.10 14:46*  字数 1157  阅读 3826 评论 21

接续上个系列之 [ 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

 ###NDK###

舞文弄墨 , 不为功名 。或有打赏 , 换口酒喝 。

赞赏支持
登录  后发表评论
 
于连林520wcf
2楼 · 2016.09.11 09:15

收录到了 android实用技术

 
捡淑
3楼 · 2016.09.12 15:57

马克

 
晴雪囍屠苏
4楼 · 2016.10.10 17:10

2.2真是不错

 
ShiroSora
5楼 · 2016.10.10 17:17

第四步的时候Error:(30, 0) Could not find method cppFlags() for arguments [] on object of type com.android.build.gradle.internal.dsl.NdkOptions.怎么办

ShiroSora: @ShiroSora 没事了,我把代码放错位置了,要放在defaultConfig里面

2016.10.10 17:30   回复
 
4b804c01a45e
6楼 · 2016.10.21 17:24

我想问一下作者,已经创建了的项目 如果找到类似C++ support这样的选项,让原有项目支持C++ support从而进行ndk开发?

 
hello_hill
7楼 · 2016.10.25 18:44

执行成功了 , 但是 .so文件并没有生成 ??

四条眼的小胖子: @hello_hill 我也是 没有报错 但是没有so文件 你的问题解决了吗

2016.12.21 10:19   回复

四条眼的小胖子: @hello_hill 哈哈 我生成了 so 了 细心的读一下cmake中的说明 我想你应该和我一样直接把把博主的cmake文档直接复制到cmake.txt文档下了 这样编译也不会出错 其实 cmake txt 已经有模板 我们仅需要把名字 路径 关联的so 替换一下就行了 希望能帮助到你

2016.12.21 10:26   回复
 
四条眼的小胖子
8楼 · 2016.12.23 22:34

现在按照博主的方法可以实现ndk的方法了。现在想请教一下,如果我在最开始创建project的时候没有勾选支持c 后续的module如何 增加ndk的编译环境呀。目前我遇到的一是用jni来写native 但是总会或多或少会出问题,请问还有其他方法吗?

逝我: @四条眼的小胖子 可以在现有项目中添加支持Native编码的gradle配置

2016.12.24 17:30   回复

四条眼的小胖子: @逝我 可否写个大概的思路。因为目前能搜到的教程都是从创建project开始

2016.12.25 13:58   回复

逝我: @四条眼的小胖子 那我最近写个教程,做一下说明 。 :smile:

2016.12.26 08:52   回复
 添加新评论  还有1条评论, 展开查看
 
FuriousTurbo
9楼 · 2017.01.03 12:04

你好,请问如果我需要创建两个c文件实现不同的功能,这时候如何在CMakeList文件中同时配置这两个c文件的信息呢?

逝我: @FuriousTurbo 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
) 在 src/main/cpp/HelloNDK.c后面继续添加另一个C文件路径就可以了 。

2017.01.03 22:28   回复
 
suym
10楼 · 2017.02.26 14:13

逝我: @suym 欢迎多多交流!

2017.02.26 20:23   回复
 
6254d6103b8a
11楼 · 2017.03.01 10:35

学习了

 
徐平伟
12楼 · 2017.05.02 19:22

如何我想生成多个.so文件,CMakeLists.txt里面应该怎么配置呢?求解~

逝我: 生成多个so文件,可以参考这篇文章http://blog.csdn.net/b2259909/article/details/58591898

2017.05.04 17:41   回复
转自:http://www.jianshu.com/p/f1b8b97d2ef8




        被以下专题收入,发现更多相似内容

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值