当前位置: 首页 > news >正文

跟鱼八学NDK开发 基于Cmake(三) 使用含有第三方动态库的自己编译好的.so

爱开发,爱鱼八! 我是yubaKevin!不是单身的程序猿! 主题:NDK开发 完美解析详细开发过程,菜鸟必备!

因为太菜,所以想写文章学习,提升自己帮助他人!如若文章有误,请大佬提笔赐教,不慎感激!

随便转载,但是一定要附上原文链接哦,注上作者:@yubakevin

我的github地址:github.com/YubaKevin 项目Demo在Trip-for-android里面,记得来个star哦

详细参考资料:developer.android.com/studio/proj…


本篇文章开发工具:AS 3.0.1 NDK版本 17

NDK开发基于CMakeLists

为什么我直接使用的.so失败?

使用.so一般是在libs下新建对应ABI文件夹放置.so,然后在Buildgradle下配置一下就好了,结果我发现无法使用。总是无法找到对应库

后来询问大佬才了解,这是jni的注册方式导致的。一般来说我们使用的是静态注册,如果像第三方那样使用需要动态注册。大佬回答如下:

这个向大佬提问的软件,是大佬的知识星球,有兴趣的朋友
也可以加入,进入星球并不是免费的,
这是加入的链接:t.zsxq.com/7UbA6MV
扫一下即可!(给大佬广告了一波,emmm里面氛围还是不错的,可以认识其他大佬,嘿嘿嘿)

现在我们先说明一下自己编写的静态注册下的.so使用方式吧!

一、使用含有第三方动态库的自己编译的.so

1.新建一个项目(或者在你需要使用.so的项目中)

2.在新建项目的libs中新建对应的ABI文件夹(我这里.so 是armeabi-v7a的)

3.将自己编译的.so和第三方.so放入进去

4.配置app下的buildgradle

    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
复制代码

5.最重要的一步:将jni类复制过来(也可以在写Jni的时候将jni类的包打成jar,在依赖到项目中使用),要保证jni类的路径和你编译.so的路径一致!

 在编译.so的时候,我们的包路径是:com.example.kevin.MyJniUtils,类名是JniUtils (参加NDK开发(二))
 所以在我们这里要保持路径需要创建相同路径包,我这里包路径是相同的,只要复制MyJniUtils和JniUtils类就好了
复制代码

配置完成如下图:ps:红色方法没关系,不报错

注:实际开发中你们项目路径名不同,创建相同路径的包就可以了。
如果路径不对你会报如下错误: java.lang.UnsatisfiedLinkError: No implementation found for XXXXXXXXXX
这里给大家提供一个网上解决办法,写的还好比我详细,你们可以看看
blog.csdn.net/ouyang_peng…

6.最后在自己的MainActity中写方法调用吧!

代码很简单,如下:


7.成功调用!!!是不是很6呢?

总结:通过跟鱼八的NDK三步走,你应该知道

	1.NDK的环境配置
	2.配置buildgradle,CMakeLists的写法
	3.静态注册下的.so的使用
复制代码

此时此刻 你一定使用了自己的.so!

有了基础,准备下一步的NDK进阶学习吧!

我是鱼八,有任何问题都可在下方讨论!谢谢!


附:以下三篇文章,均是基础内容,大佬看了有话说,菜鸟看了有所获!

跟鱼八学NDK开发 基于Cmake(一) NDK环境配置

跟鱼八学NDK开发 基于Cmake(二)附有第三方动态库编写私有的动态库.so

跟鱼八学NDK开发 基于Cmake(三) 使用自己编写的动态库.so

相关文章:

  • MVC-Model数据注解(三)-Remote验证的一个注意事项
  • Go语言编写的web管理平台生成框架
  • 如何对高管实施股权激励?
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • PhotoShop制作gif动态广告效果示例
  • 怎样轻松将SD卡照片数据恢复
  • [总结型] HADOOP HDFS BALANCER介绍及经验总结
  • 销售财务出身的创业者,占了95%,未来却可能被他打败
  • centos搭建FTP文件服务
  • Odoo 自定义Widgets 基础教程(章节1)
  • 改maven下创建的动态网站依赖的jre版本
  • Linux 服务管理两种方式service和systemctl
  • 渗透测试(theharvester steghide)
  • Gsoap编译
  • springboot启动时可以用到的事件监听
  • 【5+】跨webview多页面 触发事件(二)
  • Android组件 - 收藏集 - 掘金
  • create-react-app做的留言板
  • Hexo+码云+git快速搭建免费的静态Blog
  • JavaScript 奇技淫巧
  • miaov-React 最佳入门
  • Nacos系列:Nacos的Java SDK使用
  • PAT A1017 优先队列
  • React中的“虫洞”——Context
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • Vue.js 移动端适配之 vw 解决方案
  • WebSocket使用
  • windows下mongoDB的环境配置
  • 给第三方使用接口的 URL 签名实现
  • 理解在java “”i=i++;”所发生的事情
  • 小李飞刀:SQL题目刷起来!
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (利用IDEA+Maven)定制属于自己的jar包
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (十三)Flask之特殊装饰器详解
  • (五)关系数据库标准语言SQL
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)详解PHP处理密码的几种方式
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET成年了,然后呢?
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • @Data注解的作用
  • [2]十道算法题【Java实现】
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [codevs] 1029 遍历问题
  • [excel与dict] python 读取excel内容并放入字典、将字典内容写入 excel文件
  • [go] 策略模式
  • [GYCTF2020]Ez_Express
  • [HDU 3555] Bomb [数位DP]