博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【从零冲击音视频开发】移动环境搭建
阅读量:160 次
发布时间:2019-02-27

本文共 3359 字,大约阅读时间需要 11 分钟。

目录

【1】

【2】【从零冲击音视频开发】移动环境搭建

【3】

移动环境搭建(以AS为例)

其实很多网站都已经有过这样的介绍了,不过既然是自己的文章,还是需要讲讲的,嘿嘿。创建一个新的AS项目,并且选择到我们的Native C++的选项来创建我们的项目。当然我们里面会看到一个C++ standard,我直接默认选的Toolchain Defalut

 

到了这里其实我们的程序就可以运行了,不信你可以直接跑,不过看看代码,你会发现存在一定的不同

为什么我们要是用Native C++?

这个问题是读者必须清楚的,Java终究并不是一门万能的语言,每门语言都是如此,有着自己的长处和局限性。不然为什么还需要Binder机制去调用一些底层的服务,因为很多东西,上层做不了。

情况可以分为以下几种:

(1)应用程序需要一些平台的相关特性支持,而Java层并没有提供相应的API,(比如OpenSL ES的使用)。

(2)调用已然存在的用C\C++编写的函数库。

(3)应用程序对一些关键操作存在一定的处理速度要求。

如何去调用Native代码

(1)编写一个带native方法的函数。

public class NativeTest {    public native void encode();}

就如上面一般创建一个文件,用native修饰即可,但是你可能会看到这个函数爆红,其实没什么关系,我们先用小锤子Build一下,正常情况下是不会报错的,因为只是这个native函数没有找到对应的C\C++函数而已,并不影响我们本身的Java类。

(2)生成一个我们需要的C\C++文件了。

1. 切换到src/main/java目录下2. 在Terminal中输入javah -jni  包名.带native的Java类// 在我的项目中的语句javah -jni  com.clericyi.player.NativeTest3. 得到一个格式为:(包名_类名).h的头文件,并将他移动到cpp的目录下

 

 

(3)得到的.h的头文件并不能够被使用,自然需要.cpp的文件来支持使用了。(上图已经给出位置)

#include 
#include
#include "com_clericyi_player_NativeTest.h"JNIEXPORT jstring JNICALL Java_com_clericyi_player_NativeTest_encode (JNIEnv *env, jobject) { return env->NewStringUTF("Encoder encoding");}

(4)使用

其实这个时候还是用不起来的,需要进行一定的配置才行,走完下面的流程应该就能看到我们的运行效果了。

(1) 修改CMakeList.txt中的对应数据,添加创建的cpp文件add_library(        # 。。。        audioencoder.cpp)(2) app -> build.gradleandroid {    defaultConfig {        externalNativeBuild {            cmake {                cppFlags "-frtti -fexceptions"                cFlags "-DSTDC_HEADERS"            }        }        ndk {            // 可以加入x86等等,跟应用的手机架构相对应            // 写了几个,到时候build中就会生成几个            abiFilters "armeabi-v7a"        }    }}

关于NDK的安装

因为我们在开发过程中必须要使用到NDK,而NDK的版本兼容是一个很重要的事情。为了能向下兼容一些版本,我们选用低一级的版本即可。(下载路径:Prefereces -> Android SDK -> SDK Tools)

相信很多人会在查资料时发现别人安装的都是NDK,而我安装的是NDK(Side by Side),但是你在自己的AS上也同样的找不到我们需要的NDK。所以给出一个网址来给读者们作为安装的教程:

效果图

 

交叉编译的原理及实践

什么叫做交叉编译?

三部分构成:

  1. 来自于第三方的源码
  2. 运行设备为Android或者iOS
  3. 编译机器是我们的PC

简单来说就是我们本地PC编译生成了一份给别人用的东西。

交叉编译实践

以作为示范例子,来做一个详细的示范。

这里已经不再建议用书上的方法了,我试了一天了,太难调通了。这里还是使用Android Studio现在自动生成带有的解决方案 -- CMake

  1. 下载完我们的LAME,把libmp3lame下的文件和include下的lame.h文件全都移动到AScpp\lame的文件夹下。

  1. 修改CMakeLists.txt
add_library( # Sets the name of the library.        # 资源库的目标名        native-lib        # Sets the library as a shared library.        SHARED        # Provides a relative path to your source file(s).        # 我们要放入的cpp文件        native-lib.cpp        # lame        lame/bitstream.c lame/encoder.c lame/gain_analysis.c        lame/lame.c lame/id3tag.c lame/mpglib_interface.c        lame/newmdct.c lame/presets.c lame/psymodel.c        lame/quantize.c lame/fft.c lame/quantize_pvt.c        lame/reservoir.c lame/set_get.c lame/tables.c        lame/takehiro.c lame/util.c lame/vbrquantize.c        lame/VbrTag.c lame/version.c)
  1. 用小锤子build一下我们的项目,会报错,我出现的错误即解决方案下方给出。
错误1:#include 
解决方案:#include "lame.h"---错误2:ieee754_float32_t fast_log2(ieee754_float32_t x);解决方案:float fast_log2(float x);
  1. 报错调整好以后我们就可以开始我们的使用了。
#include 
#include
#include "com_clericyi_player_NativeTest.h"JNIEXPORT jstring JNICALL Java_com_clericyi_player_NativeTest_encode (JNIEnv *env, jobject) { return env->NewStringUTF(get_lame_version());}

可以把上文中使用过的那个C++文件的返回值修改成这个,就能够得到效果了。

基本这就完事儿了,如果想要做更深层次的了解,你可以看这样项目结构用于自学,对应的项目中的内容是书上的一个用于将PCM格式文件转化为MP3格式的范例。

PCM的文件可以自己去随便捞一个,因为求方便我是用adb直接推到虚拟机中的。

 

以上就是我的学习成果,如果有什么我没有思考到的地方或是文章内存在错误,欢迎与我分享。

 

 

转载地址:http://hezb.baihongyu.com/

你可能感兴趣的文章