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

827 阅读3分钟

爱开发,爱鱼八! 我是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:红色方法没关系,不报错

jni路径一致

注:实际开发中你们项目路径名不同,创建相同路径的包就可以了。
如果路径不对你会报如下错误: 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