前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【开发者福利】手把手教你用android studio进行NDK开发

【开发者福利】手把手教你用android studio进行NDK开发

作者头像
WeTest质量开放平台团队
修改2018-10-30 11:24:31
7650
修改2018-10-30 11:24:31
举报
文章被收录于专栏:WeTest质量开放平台团队的专栏

一.介绍

NDK其实是提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。至于为什么要用NDK,一般都是出于一下几个原因:

  1.代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。

  2.可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。

  3.提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。

     4.便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。

二.准备

NDK包下载地址请参考此贴:http://www.cnblogs.com/yaotong/archive/2011/01/25/1943615.html

我选择的是 http://dl.google.com/android/ndk/android-ndk32-r10-windows-x86_64.zip

下载完ndk的zip包,我解压到D:\Android这个目录下了:

有了这个包包,就不用再安装什么cygwin了,因为这个ndk包里面集成了linux的编译功能。

三.步骤

1.在android studio里新建一个新项目,或者新建一个module

具体如何操作,本文不做详细介绍了。我是在已有的项目里面添加了一个新的android library类型的module,名称为cloudNDKTest。

2.环境配置

依次点击菜单栏File-->ProjectStructure,或者使用快捷键ctrl+alt+shift+s,然后如图操作

完成之后,会在local.properties文件中生成一下一个配置:

3.编写native方法

新建一个java文件,声明一个静态的native方法,方法红名也没有关系:

4.编译工程

执行make project,目的是编译成对应的class文件,后面生成.h文件的时候需要用上。

5.创建jni目录

将视图由Android切换成Project,在src/main目录下创建jni目录,和java目录同级

6.生成c++的.h文件

点击菜单栏View-->Tool Windows --> Terminal,或者快捷键Alt+F12,呼出终端窗口:

然后在Terminal窗口里执行以下命令:

cd cloudndktest/src/main

javah -d jni -classpath D:/Android/android-sdk/platforms/android-22/android.jar;../../build/intermediates/classes/debug com.tencent.XXX.XXX.cloudndktest.CloudNdkTest

其中,javah是生成头文件需要的工具,-d是指定文件创建的目录位置,-classpath是指定SDK文件下android.jar所在的文件位置。英文;后面的就是指定了步骤4生成的class文件

最后会生成:

7.编写cpp文件

在jni目录下创建cpp文件,不要勾选下面标红的部分,因为.h文件已经存在了。

编写cpp文件,include上边创建过的.h文件,实现具体函数。

8.编译

a. 先在module的build.gradle里面添加如下内容:

以上配置代码指定的so库名称为CloudNdkTest;链接时使用到的库,对应android.mk文件中的LOCAL_LDLIBS;以及最终输出指定三种abi体系结构下的so库。

b. 配置gradle.properties文件,添加

android.uesDeprecatedDNK=true

c. 在步骤3编写的java的class里面添加静态库的引用:

d. 如果遇到如下报错,请在jni目录下创建一个util.c的空文件,这据说是ndk的一个bug

e. 执行make project编译工程

四.注意事项

如果cpp的实现里面用到了stl的库,需要在8.a的步骤里添加:

目前支持以下几种编译链接方式:

stlport_static --> 以静态链接的方式使用stlport版本的STL stlport_shared --> 以动态链接的方式使用stlport版本的STL

gnustl_static  --> 以静态链接的方式使用gnu版本的STL

需要注意的是尽量通过静态库编译,这样不会造成多个module之间的so文件冲突,还能减小最后的包文件大小。

(本文作者:孙小阳)

腾讯WeTest官网: http://wetest.qq.com/

腾讯WeTest是腾讯游戏官方推出的一站式游戏测试平台,与全民突击、天天酷跑、全民超神等精品手游强强联手深入合作,十余年来不断为游戏提供优秀测试方案和测试工具,是推动腾讯游戏研发效率不断提升、对游戏开发的全生命周期进行质量保障的重要平台

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-02-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯WeTest 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
测试服务
测试服务 WeTest 包括标准兼容测试、专家兼容测试、手游安全测试、远程调试等多款产品,服务于海量腾讯精品游戏,涵盖兼容测试、压力测试、性能测试、安全测试、远程调试等多个方向,立体化安全防护体系,保卫您的信息安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档