android cpp做成so库,android so库、jar包生成和使用

搞了很久的Android开发了,一直在使用别人(第三方的sdk),所以今天突发奇想,自己搞一个NDK项目提供给其他app使用。本篇文章就从ndk环境到SDK生成、使用一起说说。废话 不多少开始动起来吧!!

一、Android studio ndk环境

点击SDK  Manager,如下图所示安装ndk。

bc4766e6964334af48d8be88f80d43ec.png

二、创建NDK项目

File->new  -> new project 选择native c++

251abc7f26eef80bab7df37481e7daa6.png

如上图所示。next->next->finish 即可生成NDK示例项目。

三、生成jar及so库

完成上述两步之后,会看到如下的项目结构:

15c6d9473099e18c11d57f292fbe2f26.png

MainActivity通过System.loadLibrary("nattive-lib")方法加载cpp下的natice-lib.cpp文件。打开natice-lib.cpp文件我们可以看到 Java_com_yan_ndkdemo_MainActivity_stringFromJNI,它的命名格式就是JAVA_包名_(调用的类名)_方法名。所以我们在其他的项目是不可以直接调用我们的cpp,so库就是cpp写的程序打包成的,也就是说我们如果直接这样打包成so库,那么别人在使用的时候必须建立一个和我们包名、类名、方法名一样的类才可以调用,为了让调用者开发便捷所以我们就得为我们的so库编写调用的sdk供别人使用。

1、新建我们的sdk程序类去实现和MainActivity一样的加载so库的方法 和调用cpp的方法,如下图 我新建了个module

01cc0393e78646215d2b608c59afc929.png

TestJni里面stringFromJNI方法报错是因为我们cpp里面调用的是MainActivity下stringFromJNI,换就话说就是没有cpp去实现TestJni下的stringFromJNI方法。 ndklib的包名须和主工程包名一致。

2、更改主工程中nattive-lib.cpp下的代码

243bd175696a9a2e9d1d2b6e54a77c2c.png

将类名改成TestJni

3、生成so库

在主项目build.gradle加入如下代码

ed97b7aeb0b2f77a8b9e4cdc4b7c62f0.png

cmake {

cppFlags ""

abiFilters 'arm64-v8a', 'armeabi-v7a', 'x86', 'x86_64'

}

build-》Rebuild project  生成so库在下图所示位置

4aaeac74e449180f096f4500a93706db.png

4.生成jar

在ndklib下build.gradle加入如下代码

df0ea9a46415370e774be34ca2125287.png

task againMakeJar(type: Copy) {

def name = 'NdkLib' //Library名称

delete 'libs/' + name + '.jar' //删除之前的旧jar包

from('build/intermediates/packaged-classes/release/') //从这个目录下取出默认jar包

into('libs/') //将jar包输出到指定目录下

include('classes.jar')

rename('classes.jar', name + '.jar') //自定义jar包的名字

}

againMakeJar.dependsOn(build)

点击右侧Gradle找到ndklib下的other-》againMakeJar,生成jar

c3a42004428b722a066812b6c71ad4f0.png

生成的jar文件就在ndklib下的libs文件夹下

最后把3、4生成的so库和jar 导入到其他项目就可以使用。如下图项目结构和使用:

6104e3f2f8d2f8ed4d540fd4fd046b92.png

e4ee2d4849cba34cb7559223a07f9b07.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AgileConfig - 轻量级配置中心1.2.0发布,全新的UI

AgileConfig自发布以来有个“大问题”-UI太丑。因为当初这个项目是给自己用的,连UI界面都没有,全靠手动在数据库里改配置。后来匆匆忙忙使用bootstrap3简单的码了一些界面就发布出来了,易用性上也做的不够好。对此我一直耿耿于怀。终于在过年…

如何解开机器学习的面纱?

目前,人工智能的应用日渐广泛。而作为人工智能核心的机器学习,是一门多领域的交叉学科,专门研究计算机模拟或实现人类学习行为的方法,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。简单来说&a…

Net与Flex入门

开源项目FluorineFx就是专门针对.NET平台与Flex通信提供的AMF(ActionScript Message Format)协议通信网关,我们可以通过FluorineFx很方便的完成与.NET的通信。 另外还可以轻松的实现及时文字沟通、视频语音通信等及时交互系统的开发。 Fluori…

MAUI来了

各位很久没有和大家说端的开发了,技术发展特别快,我不知道还有多少国内的开发人员还坚守用Xamarin,但是.NET的迭代变化还是让国内.NET社区热闹起来了。去年虽然疫情,但微软还是在Build上发布了MAUI。微软这次把MAUI完全整合到了.N…

编程到底难在哪里? 从一个美国实习生的故事说起

记得之前组里来了一个美国实习生小伙子,很极客的那种,干活快,一天能给你写2000行代码(我复查的速度跟不上他写的速度),让做什么东西,上午告诉做个这个功能,下午就能在测试环境跑起来演示了。跟他单独开会的…

温故知新,DotNet Core SDK和.Net CLI十八般武艺

简介.NET命令行接口 (CLI) 工具是用于开发、生成、运行和发布.NET应用程序的跨平台工具链。https://docs.microsoft.com/zh-cn/dotnet/core/tools/SDK.NET SDK (Software Development Kit) v5.0.201.exe里程碑发布日期.NET Core 2.1.x (servicing)LTS (Long Term Support) rele…

谁说数学没用,一旦我们用在赚钱上,全世界都害怕

今天来说说“量化”投资这个门派的开山祖师、美国“赌神”——爱德华 索普。爱德华 索普是一位大教授,天才数学家,非常喜欢扑克牌博弈游戏。一般人玩扑克也就只盯着眼前输赢,爱德华 索普却花了两年时间利用早期的IBM计算机和概率论中的凯利…

2021年春招Elasticsearch面试题

1、Elasticsearch是如何实现master选举的?1、对所有可以成为master的节点根据nodeId排序,每次选举每个节点都把自己所知道节点排一次序,然后选出第一个(第0位)节点,暂且认为它是master节点。 2、如果对某个…

android qq红包,Android实现QQ抢红包插件

又想到快要过年了,到时候还不知道群里要发好多红包,所以我将之前在网上宕的一份微信抢红包的代码修改了一下,实现了QQ抢红包!可以支持抢QQ拼手气红包,普通红包,口令红包,现在再也不怕20年单身手…

8个Python高效数据分析的技巧

不管是参加Kaggle比赛,还是开发一个深度学习应用,第一步总是数据分析。这篇文章介绍了8个使用Python进行数据分析的方法,不仅能够提升运行效率,还能够使代码更加“优美”。一行代码定义List定义某种列表时,写For 循环过…

NET问答: 如何在 ASP.NET Core Web API 的 Response 中添加自定义的 Header ?

咨询区 JDawg:我正在将 Web API 2 移植到 ASP.NET Core Web API 上,以前我都直接在 Response 属性上添加自定义的 Header,如下代码所示:HttpResponseMessage response new HttpResponseMessage(HttpStatusCode.OK); response.Hea…

一个免费兑换iPhone X的机会,就这样被你错过了

嗨~我是大家最爱的小树,第一次写文,有点小鸡冻!!!小树此行是带着超模君的礼物来的哦!上周准备会员周回馈粉丝的时候,超模君突然决定要送模友们:iPhone X !!&a…

正则表达式学习神器!

推荐一款优秀的正则表达式在线可视化工具我相信很多朋友第一次听到正则表达式时,都感觉这是一个高大上的名词。其实,简单来说,正则表达式就是用来匹配文本的。正则表达式里的 “正” 是指常客,即经常出现、通用的意思;…

数据可视化,带给你的惊艳并不止这一点!

在大数据时代的现今,数据庞大且繁杂,仅通过简单的数据整理得出清晰的结论,已经不太合理。实际上,若要简明扼要地展示出结论,不妨考虑一下数据可视化。那么,什么是数据可视化呢?数据可视化&#…

关于C3P0容错和自动重连特性的研究

为什么80%的码农都做不了架构师?>>> 最近常有数据库和网络设备升级和搬迁等事情,而各个应用都是基于数据库连接池做的,大部分都是基于C3P0,数据库或网络状况的变动都会导致客户端连接池中的connection失效&#xff0c…

android otg主从切换,一种自动切换OTG设备主从模式下的Vbus电压的方法与电路与流程...

本发明涉及otg设备的检测领域,更具体地说,涉及一种自动切换otg设备主从模式下的vbus电压的方法与电路。背景技术:现有技术中,具备otg功能的设备通过检测usb_id引脚的状态来判断工作为host(主模式/usb_id悬空)或者device(从模式/us…

又一起.NET程序挂死, 用 Windbg 抽丝剥茧式的真实案例分析

一:背景 1. 讲故事前天有位粉丝朋友在后台留言让我帮忙看看他的 Winform程序 UI无响应 410线程 到底是啥情况,如下图:说实话,能看到这些真实案例我是特别喜欢的???????????? ,就像医生看病,光…

别乱说,算法才不是脑筋急转弯

老崔去某厂笔试时,遇到了经典的「狼、羊、白菜 过河问题」。由于经常看算法方面的内容,这道对于他来说,so easy。题目大概是这样:题号1:农夫需要把狼、羊、菜和自己运到河对岸去,只有农夫能够划船&#xff…

HTML坐标不随着屏幕大小改变,HTML热区map坐标,随窗口大小自适应办法(javascript)...

为图片添加MAP:/>/>/>/>图片大小随页面变化,需要MAP中每个area的坐标也随页面等比例变化。Javascript实现:adjust();var timeout null;//onresize触发次数过多,设置定时器window.onresize function () {clearTimeou…

NET问答: Find() 和 Where().FirstOrDefault() 该如何选择 ?

咨询区 KingOfHypocrites:我经常看到别人用 Where.FirstOrDefault() 获取某一个匹配集合的第一个元素,我在想为什么他们不使用 Find() 呢 ? 是不是前者更高级一点?有人能告诉我它们的差别吗?比如下面的代码:namespace…