爱开发,爱鱼八! 我是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的使用
复制代码