前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android如何调用so文件

Android如何调用so文件

作者头像
用户5521279
发布2020-03-05 11:33:06
10.2K0
发布2020-03-05 11:33:06
举报
文章被收录于专栏:搜狗测试搜狗测试

前言

小编对接的安卓测试项目团队中有部分团队使用C++开发项目代码,出于好奇去学习了解了一下在安卓项目中集成C++代码的方法,下面和大家分享一下。 在安卓开发中经常会遇到需要通过java调用其它语言编写的代码的情况,这主要是由于以下几方面的原因:

  • 1.运行效率高:在高性能要求的需求中,使用本地代码效率更高,如使用CC++编写算法执行效率更高。
  • 2.代码安全性高Java是半解释性语言,容易被反汇编得到源码,而CC++等本地代码则不会。
  • 3.扩展性好:可以使用其他语言开发的开源库。
  • 4.易于复用:用本地代码开发的代码不仅在Android中使用,还可嵌入到其他类型平台上使用。

使用C\C++开发的代码通常编译成so文件对外提供,以便在安卓或其他类型平台上使用。最近在尝试编译C\C++代码产生so文件的时候总结发现so文件的编译产生方式大概经历了3个阶段:

  • 第一个阶段:通过Android.mk文件和Application.mk文件编译产生so文件;
  • 第二个阶段:通过Gradle提供的gradle-experimental插件编译产生so文件;
  • 第三个阶段:目前最常用的方式是使用CMakeGradle编译出so文件。

下面通过一个安卓调用C++代码打印字符串的实例介绍一下在Android Studio中使用最新的编译方式编译出so文件的步骤。

第一步:新建工程

新建工程:打开AS,新建工程。

设置NDK路径:创建完工程之后先点击右上角的Project Structure按钮设置NDK路径,如果没有设置的话则使用IDE提供的下载路径。

下载SDK工具:下载界面如下图,需要安装LLDBCMakeNDK三个工具:

另外,本人使用的Gradle版本如下:

第二步:JNI编程

JNIjava调用C\C++代码的接口定义规范,是实现安卓调用C\C++代码必不可少的一部分,下面是本实例中JNI实现相关代码。

定义JNI接口:创建一个java文件,在其中声明javanative交互的代码,注意方法需要使用native进行修饰。

生成C\C++头文件:在Terminal中执行下面两句命令,可以看到在工程目录中会产生一个cpp文件夹,并且生成了MyNDK的头文件。

代码语言:javascript
复制
cd app/src/main/java

编写C\C++实现代码:在cpp路径下创建一个.cpp文件,并且在.cpp文件中编写与java文件中声明的native方法相对应的C++代码实现,需要注意的是在.cpp文件中需要将"."写成"_"

代码语言:javascript
复制
#include "com_example_ndkdemo_MyNDK.h"

第三步:配置编译文件

Gradle需要通过调用CMake编译脚本将C\C++代码编译为java可以调用的外部链接库,所以接下来需要进行GradleCMake的配置。

配置CMakeLists:在app目录下创建CMakeLists.txt文件并且在其中声明工程要生成的动态库。

配置项目build.gradle文件

代码语言:javascript
复制
apply plugin: 'com.android.application'

配置部分新增加了两部分externalNativeBuild代码,但是这两部分的功能不同:

1)编译参数&编译平台指定defaultConfig目录下的是告诉程序编译出什么样的so文件。其中,cppFlagsC++编译器的参数;abiFilters是过滤器,只会编译生成声明的CPU架构so文件。

2)编译路径指定android目录下的是告诉程序如何去编译,pathCMakeLists.txt文件目录的地址。

第四步:编译&验证

编译生成so文件:到现在为止,编译so文件的准备工作已经都完成了,这时候只要重新点击一下make Project就好了。然后我们就可以发现在app目录下生成了.externalNativeBuild文件夹,同时在app\build\intermediates\cmake\debug\obj目录下生成我们所需要的目标so文件。

调用JNI:现在在我们声明的getHelloString()方法之前加载刚才声明产生的so库,然后再在程序中调用getHelloString()方法就可以执行so库中对应的C++代码了。

开始执行:运行结果如下:

结束语

上面是小编自己学习使用CMakeGradle编译so文件的详细步骤。 但在新版的Android Studio中已经支持直接创建Native C++的工程,在这个工程中直接集成了所有需要配置编译so的文件,可以在这类项目的基础上进行修改编译出目标so文件,更加简单方便。

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

本文分享自 搜狗测试 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 第一步:新建工程
  • 第二步:JNI编程
  • 第三步:配置编译文件
  • 第四步:编译&验证
  • 结束语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档