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,一经查实,立即删除!

相关文章

菜鸟修炼C语言小设计之——工资统计

本设计完成一个工资统计的小设计,涉及的C语言重点知识有: 1,结构体 2,结构体指针数组 3,枚举类型 1.1 设计题目 本课程设计要求设计一个公司职员的数据结构,并使用结构指针数组存储职员信息,统计…

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

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

android 无法安装测试版本,在测试应用更新时,安装无提示阻止Android版本构建签名APK...

当我尝试更新我的应用程序(在已经从playstore安装的应用程序上手动安装带有更高版本的已签名APK)时,它未被安装(“应用程序未安装“)并在Studio中显示以下错误:I/Finsky: [1144] com.google.android.finsky.verifier.impl.en.c(263): Verifying id8,result-1I/Finsk…

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

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

Net与Flex入门

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

MAUI来了

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

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

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

华为平板搭鸿蒙,首款麒麟9000平板入网,全系搭载鸿蒙OS,华为反击了!

虽然华为麒麟芯片存货越来越少了,但是关于华为手机和华为平板的消息还是很多的,这证明华为的大招估计还没有放完。最近一款新的华为平板入网,比较让人惊讶的是,这款平板竟然依旧搭载了麒麟9000处理器,并且在其它配置上…

oop1

1、面向过程编程方法,是将程序看成一个个步骤;而面向对象编程(OOP)方法是将程序看成一个个具有不同功能的部件在协同工作,类就是描述这些部件的数据结构和行为方式,而对象就是这些具体的部件。 2、对象的定义:一个对象…

温故知新,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…

android bitmap string,Android Bitmap到Base64字符串(Android Bitmap to Base64 String)

Android Bitmap到Base64字符串(Android Bitmap to Base64 String)如何将一个大的Bitmap(用手机相机拍摄的照片)转换为Base64 String?How do I convert a large Bitmap (photo taken with the phones camera) to a Base64 String?原文:https://stackover…

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

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

网络工程师要如何选择?

09年,迷茫的我走上了IT这条路子. 一年的时间,自己边学习边工作,在学习的同时实践那些技术. 不停的学习,脚步一直都都没停止的向前走. 学习着各种各样的技术,LINUX\CISCO\SQL\等等等等...... 一开始因为不懂,本身想学习的是JAVA\C\C#\等关于编程的技术...可是莫名的就走到的服务…

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…

android photopicker怎么修改状态栏,有没有办法阻止UIImagePickerController更改状态栏样式?...

Matej Bukovi..39我希望状态栏保持黑色不透明,同时显示照片库选择器(照片选择器将其更改为黑色半透明),这解决了我的问题.设置UIImagePickerDelegate:libraryUI.delegate self;实现以下回调:- (void)navigationController:(UINavigationController *)navigationControllerwill…

网规:第4章 网络安全-4.5IDS和IPS

4.5 IDS和IPS(P643-658)1、***检测系统概述(1)IDS的定义是一种主动保护自己,使网络和系统免遭非法***的网络安全技术,它依照一定的安全策略,对网络、系统的运行状况进行监视,尽可能发…