网站首页 > 技术文章 正文
概述
和学习其它IT编程一样,学习Android编程知识最好的办法也是实战。今天就来和大家分享一下怎么使用JNI构建wav转码amr的so动态库。先放上一张成果图( 如图:.so动态库目录图.png)。
配置和准备代码
(1)在电脑上面安装好ndk-bundle。为了使用“ndk build”命令进行构建,需要在Android Studio的主项目找到“local.properties”文件(如图:本地属性配置文件.png)上面配置好ndk.dir的环境变量,因为我用的Mac电脑进行编程的,所以环境变量和Windows电脑上面不一样,具体的ndk-bundle都是在sdk目录下的。
我Mac电脑上的ndk.dir的环境变量: ndk.dir=/Users/tiantan/Library/Android/sdk/ndk-bundle
(2)新建一个AmrEncoder.java文件(如图:AmrEncoder类代码.png),用于加载so库和封装native的方法。其中的Mode是一个枚举类型,都是进行编码使用的模式。用于encode(int mode)方法中的mode参数。其中init(int dtx)是要在开始使用的时候进行初始化。
(3)在jni目录下面创建amr_encoder.cpp文件,在amr_encoder.cpp中实现AmrEncoder相关的native方法,具体实现(如图)。
(4)再到Android.mk文件中进行文件加载配置(如图:Android.mk配置内容.png)。其中LOCAL_MODULE、LOCAL_SRC_FILES、BUILD_SHARED_LIBRARY配置很关键。
1.LOCAL_MODULE是指定配置构建最终库文件的名称。
2.LOCAL_SRC_FILES是指定构建的加载本地源文件。
3.BUILD_SHARED_LIBRARY是指定打共享库文件。因为我们需要构建so动态库,所以我们必须指定这个才行。如果是要构建.a静态库,就需要使用BUILD_STATIC。
(5)在Application 的mk文件(如图:Application mk文件内容)中我们需要指定构建那些abi的平台库,这里不做特殊的指定,直接设置为全平台,就是abi:=all。
最终构建出来的so动态库就是包含(arm64-v8a、armeabi、 armeabi-v7a 、mips 、mips64 、x86 、x86_64)七个类型的。
开始构建so动态库
(1)现在让我们开始进行构建工作。我们需要打开android studio下方的终端工具“Terminal”,通过"cd src/main/jni"命令行进入到项目的“jni目录”下(如图:命令行进入JNI目录.png)。
(2)再执行“ndk-build”命令,就可以看到已经正式开始构建so动态库了(如图:ndk-build命令执行.png)。接下来需要等待大概2-3分钟就可以全部构建完成。
(3)你肯定想知道构建的结果在哪里看呢?构建完成后去看jni目录的同一级中多出了两个目录:libs和obj,libs目录就是存放我们最终构建出来的.so动态库目录,里面有七个平台类型的库文件目录和文件(如图:构建出来的.so动态库位置.png),而obj目录则是保存构建过程中生成临时文件的地方。到这里我们就完成了全部的构建。
总结经验
1. 学习知识最好的办法也是实战。多学多练可以巩固。
2.构建的过程并不是那么的顺利,遇到错误的时候,不要急躁,耐心分析日志就可以找出解决办法。
嘿嘿、欢迎各位点评,有问题可以留言平论,一起学习成长。喜欢就点个赞,加一下关注吧。谢谢。
猜你喜欢
- 2024-10-27 NDK开发——FFmpeg视频解码 ffmpeg ndk
- 2024-10-27 Camera基本代码架构 camera calibrator
- 2024-10-27 android 功耗分析方法和优化(1) 功耗app
- 2024-10-27 Cocos Creator v2.3.2 发布了!全新 Launcher 效率飞起!
- 2024-10-27 如何androd动态注册编写计算器 淘宝动态评分计算器在线
- 2024-10-27 高通平台OV8856 Camera的bring up总结
- 2024-10-27 高通平台移植GC2145 Camera驱动 高通驱动安装
- 2024-10-27 《坎公骑冠剑》光炮Android Mk.99技能与背景故事
- 2024-10-27 ubuntu移植libwebp到Android平台 ubuntu移植到arm
- 2024-10-27 步步为营,十分钟学会 Native JNI(附带彩蛋)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)