Android 如何使用JNI构建wav转码amr的so动态库

概述

和学习其它IT编程一样,学习Android编程知识最好的办法也是实战。今天就来和大家分享一下怎么使用JNI构建wav转码amr的so动态库。先放上一张成果图( 如图:.so动态库目录图.png)。

.so动态库目录图.png

配置和准备代码

(1)在电脑上面安装好ndk-bundle。为了使用“ndk build”命令进行构建,需要在Android Studio的主项目找到“local.properties”文件(如图:本地属性配置文件.png)上面配置好ndk.dir的环境变量,因为我用的Mac电脑进行编程的,所以环境变量和Windows电脑上面不一样,具体的ndk-bundle都是在sdk目录下的。

本地属性配置文件.png

我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)是要在开始使用的时候进行初始化。

AmrEncoder类代码.png

(3)在jni目录下面创建amr_encoder.cpp文件,在amr_encoder.cpp中实现AmrEncoder相关的native方法,具体实现(如图)。

amr_encoder.cpp实现native方法.png

(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。

Android.mk配置内容.png

(5)在Application 的mk文件(如图:Application mk文件内容)中我们需要指定构建那些abi的平台库,这里不做特殊的指定,直接设置为全平台,就是abi:=all。

最终构建出来的so动态库就是包含(arm64-v8a、armeabi、 armeabi-v7a 、mips 、mips64 、x86 、x86_64)七个类型的。

Application mk文件内容

开始构建so动态库

(1)现在让我们开始进行构建工作。我们需要打开android studio下方的终端工具“Terminal”,通过"cd src/main/jni"命令行进入到项目的“jni目录”下(如图:命令行进入JNI目录.png)。

命令行进入JNI目录.png

(2)再执行“ndk-build”命令,就可以看到已经正式开始构建so动态库了(如图:ndk-build命令执行.png)。接下来需要等待大概2-3分钟就可以全部构建完成。

ndk-build命令执行.png

(3)你肯定想知道构建的结果在哪里看呢?构建完成后去看jni目录的同一级中多出了两个目录:libs和obj,libs目录就是存放我们最终构建出来的.so动态库目录,里面有七个平台类型的库文件目录和文件(如图:构建出来的.so动态库位置.png),而obj目录则是保存构建过程中生成临时文件的地方。到这里我们就完成了全部的构建。

构建出来的.so动态库位置.png

总结经验

1. 学习知识最好的办法也是实战。多学多练可以巩固。

2.构建的过程并不是那么的顺利,遇到错误的时候,不要急躁,耐心分析日志就可以找出解决办法。

嘿嘿、欢迎各位点评,有问题可以留言平论,一起学习成长。喜欢就点个赞,加一下关注吧。谢谢。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180117A10G4M00?refer=cp_1026

相关快讯

扫码关注云+社区