当前位置: 首页 > news >正文

电商网站开发流程文档管理会计

电商网站开发流程文档,管理会计,wordpress 小学生,一个人可做几次网站备案本文你可以了解到 本文将介绍如何将上一篇文章编译出来的 FFmpeg so 库#xff0c;引入到 Android 工程中#xff0c;并验证 so 是否可以正常使用。 一、开启 Android 原生 C/C 支持 在过去#xff0c;通常使用 makefile 的方式在项目中引入 C/C 代码支持#xff0c;随…本文你可以了解到 本文将介绍如何将上一篇文章编译出来的  FFmpeg so 库引入到  Android 工程中并验证  so 是否可以正常使用。 一、开启 Android 原生 C/C 支持 在过去通常使用 makefile 的方式在项目中引入 C/C 代码支持随着 Android Studio 的普及makefile 的方式已经基本被 CMake 替代。 有了 Android 官方的支持NDK 层代码的开发变得更加容易。以前一谈到 Android NDK 许多人就会大惊失色感觉是深不可测的东西一方面是 makefile 的编写很难一方面是 C/C 相比 Java 来说比较晦涩。 但是不必担心一是有了 CMake 二是对于 C/C 的基本使用其实和 Java 差不多本系列涉及到的也都是对 C/C 的基础使用毕竟高级的我也不会不是吗哈哈哈 1. 安装 CMake 首先需要下载 CMake 相关工具在 Android Studio 中依次点击 Tools-SDK Manager-SDK Tools然后勾选 CMake : CMake 构建工具 LLDB : C/C 代码调试工具 NDK : NDK 环境 最后依次点击 OK-OK-Finish 开始下载文件比较大可能会比较慢请耐心等待。 下载CMake工具 2. 添加 C/C 支持 有两种方式 一是新建一个新的工程并勾选  C/C 支持选项系统将自动创建一个支持  C/C 编码的工程。 二是在已有的项目上手动添加所有的添加项来支持  C/C 编码其实就是自己手动添加 「第一种方式」中  Android Studio 为我们自动创建的那些东西。 首先通过新建一个新工程的方式看看 IDE 为我们生成了那些东西。 1新建 C/C 工程 依次点击 File - New - New Project进入新建工程页面拉到最后选择 Native C 然后按照默认配置一路 Next - Next - Finish 即可。 新建C工程 2Android Studio 自动生成了什么 生成的工程目录如下 工程目录 重点关注上图标注的3个地方 第一最上层的 MainActivity class MainActivity : AppCompatActivity() { ​override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main) ​// Example of a call to a native methodsample_text.text stringFromJNI()} ​/*** A native method that is implemented by the native-lib native library,* which is packaged with this application.*/external fun stringFromJNI(): String ​companion object { ​// Used to load the native-lib library on application startup.init {System.loadLibrary(native-lib)}}} 很简单使用过 so 库的应该都看得懂这里简单说一下。 代码的最下面companion object 在 Kotlin 中表示静态代码块类似 Java 中的 static { }其中的代码有且只会被执行一次。 接着在 init{} 方法中加载了 C/C 代码编译成的 so 库 native-lib。 往上一句代码用 external 声明了一个外部引用的方法 stringFromJNI() 这个方法和 C/C 层的代码是对应的。 最终在最上面的 onCreate 中将从 C/C 层返回的 String 显示出来。 【免费分享】音视频学习资料包、大厂面试题、技术视频和学习路线图资料包括C/CLinuxFFmpeg webRTC rtmp hls rtsp ffplay srs 等等有需要的可以点击788280672加群免费领取~ 第二创建了一个 cpp 文件包 其中有两个文件非常重要分别是 native-lib.cpp 、 CMakeLists.txt。 i. native-lib.cpp 是一个 C 接口文件在 MainActivity 中声明的外部方法将在这里得到实现。 自动生成 native-lib.cpp 的内容如下 #include jni.h#include string ​extern C JNIEXPORT jstring JNICALLJava_com_chenlittleping_mynativeapp_MainActivity_stringFromJNI(JNIEnv *env,jobject /* this */) {std::string hello Hello from C;return env-NewStringUTF(hello.c_str());} 可以看到这个 cpp 文件中的方法命名非常的长不过其实非常简单。 首先是头部固定写法 extern C JNIEXPORT jstring JNICALL extern C 表示以 C语言 的方式来编译 jstring 表示该方法返回类型是 Java 层的 String 类型类似的还是有: void jint等 然后是 Java 层对应方法的映射即整个方法命名其实是 Java 层对应方法的绝对路径。 其中最前面的 Java_ 是固定写法 com_chenlittleping_mynativeapp_MainActivity_ 对应的是 com.chenlittleping.mynativeapp.MainActivity.其实就是 . 换为 _ stringFromJNI 和 Java 层的方法一致。 最后是两个参数 JNIEnv *env 和 jobject分别代表 JNI 的上下文环境和调用这个接口的 Java 的类的实例。 调用这个方法将会在 C 层创建一个字符串并以 Java#String 的类型返回。 ii. CMakeLists.txt  也就是构建脚本。内容如下 # cmake 最低版本cmake_minimum_required(VERSION 3.4.1) ​# 配置so库编译信息add_library( # 输出so库的名称native-lib ​# 设置生成库的方式默认为SHARE动态库SHARED ​# 列出参与编译的所有源文件native-lib.cpp) ​# 查找代码中使用到的系统库find_library( # Sets the name of the path variable.log-lib ​# Specifies the name of the NDK library that# you want CMake to locate.log) ​# 指定编译目标库时cmake要链接的库target_link_libraries(# 指定目标库native-lib 是在上面 add_library 中配置的目标库native-lib# 列出所有需要链接的库${log-lib}) 这是最简单的编译配置具体见上面的注释。 CMakeLists.txt 的目的就是配置可以编译出 native-lib so 库的构建信息。 说白了就是告诉编译器 - 编译的目标是谁- 依赖的源文件在哪里找- 依赖的 系统或第三方 的 动态或静态 库在哪里找。 第三在 Gradle 文件中注册 CMake 脚本 在 第二步 中已经把构建 so 库的信息配置好了接下来要把这些信息注册到 Gradle 中编译器才会去编译它。 app 的 build.gradle 内容如下 apply plugin: com.android.application ​apply plugin: kotlin-androidapply plugin: kotlin-android-extensions ​android {compileSdkVersion 28buildToolsVersion 29.0.1defaultConfig {applicationId com.chenlittleping.mynativeappminSdkVersion 19targetSdkVersion 28versionCode 1versionName 1.0testInstrumentationRunner androidx.test.runner.AndroidJUnitRunner// 1) CMake 编译配置externalNativeBuild {cmake {cppFlags }}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile(proguard-android-optimize.txt), proguard-rules.pro}}// 2) 配置 CMakeLists 路径externalNativeBuild {cmake {path src/main/cpp/CMakeLists.txtversion 3.10.2}}} ​dependencies {// 省略无关代码//......}最主要的两个地方是两个 externalNativeBuild 。 第 1 个 externalNativeBuild 中可以做一些优化配置比如只打包包含 armeabi 架构的 so  externalNativeBuild {cmake {cppFlags }ndk {abiFilters armeabi //, armeabi-v7a}}第 2 个 externalNativeBuild主要是配置 CMakeLists.txt 的路径和版本。 Android Studio 为我们生成的关于  C/C 支持的主要就是以上三个地方有了以上配置就可以在  MainActivity 页面中正常的显示出  Hello from C 。 3) 在已有工程上添加 C/C 支持 前面就说过在已有项目上添加 C/C 支持就是由我们自己手动添加整个配置。那么根据签名介绍的三个步骤依葫芦画瓢就可以添加了。 这里刚好就用添加 FFMpeg so 到本系列文章现有 Demo 工程中来演示一遍。 二、引入 FFmpeg so 1. 新建 cpp 目录 首先在 app/src/main/ 目录下新建文件夹并命名为 cpp 。 接着在 cpp 目录下右键 New - C/C Source File 新建 native-lib.cpp 文件。 接着在 cpp 目录下右键 New - File 新建 CMakeLists.txt 先将上面 IDE 生成的那份代码粘贴进来 FFmpeg的配置在后面详细讲解。 # CMakeLists.txt ​# cmake 最低版本cmake_minimum_required(VERSION 3.4.1) ​# 配置so库编译信息add_library( # 输出so库的名称native-lib ​# 设置生成库的方式默认为SHARE动态库SHARED ​# 列出参与编译的所有源文件native-lib.cpp) ​# 查找代码中使用到的系统库find_library( # Sets the name of the path variable.log-lib ​# Specifies the name of the NDK library that# you want CMake to locate.log) ​ # 指定编译目标库时cmake要链接的库 target_link_libraries(# 指定目标库native-lib 是在上面 add_library 中配置的目标库native-lib ​# 列出所有需要链接的库${log-lib}) 2. 将 CMakeLists 配置到 build.gradle 中 android {// ...defaultConfig {// ...// 1) CMake 编译配置externalNativeBuild {cmake {cppFlags }}}// ...// 2) 配置 CMakeLists 路径externalNativeBuild {cmake {path src/main/cpp/CMakeLists.txtversion 3.10.2}}} ​// ...如果只是简单的编写 C/C 代码以上基础配置就可以了。 接着来看看本文的重点如何使用 CMakeLists.txt 引入 FFmpeg 的动态库。 3. 将 FFmpeg so 库放到对应的 CPU 架构目录 在 上一篇文章中我们编译的 FFmpeg so 库的 CPU 架构为 armv7-a所以我们需要把所有的 so 库放置到 armeabi-v7a 目录下。 首先在 app/src/main/ 目录下新建文件夹并命名为 jniLibs 。 app/src/main/jniLibs 是 Android Studio 默认的放置 so 动态库的目录。 接着在 jniLibs 目录下新建 armeabi-v7a 目录。 最后把 FFmpeg 编译得到的所有 so 库粘贴到 armeabi-v7a 目录。如下 so目录 4. 添加 FFmpeg so 的头文件 在编译 FFmpeg 的时候除了生成 so 外还会生成对应的 .h 头文件也就是 FFmpeg 对外暴露的所有接口。 FFmpeg编译输出 在 cpp 目录下新建 ffmpeg 目录然后把编译时生成的 include 文件粘贴进来。 头文件目录 5. 添加、链接 FFmpeg so 库 上面已经把 so 和 头文件 放置到对应的目录中了但是编译器是不会把它们编译、链接、并打包到 Apk 中的我们还需要在 CMakeLists.txt 中显性的把相关的 so 添加和链接起来。完整的 CMakeLists.txt 如下 cmake_minimum_required(VERSION 3.4.1) ​# 支持gnu11set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -stdgnu11) ​# 1. 定义so库和头文件所在目录方面后面使用set(ffmpeg_lib_dir ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})set(ffmpeg_head_dir ${CMAKE_SOURCE_DIR}/ffmpeg) ​# 2. 添加头文件目录include_directories(${ffmpeg_head_dir}/include) ​# 3. 添加ffmpeg相关的so库add_library( avutilSHAREDIMPORTED )set_target_properties( avutilPROPERTIES IMPORTED_LOCATION${ffmpeg_lib_dir}/libavutil.so ) ​add_library( swresampleSHAREDIMPORTED )set_target_properties( swresamplePROPERTIES IMPORTED_LOCATION${ffmpeg_lib_dir}/libswresample.so )add_library( avcodecSHAREDIMPORTED )set_target_properties( avcodecPROPERTIES IMPORTED_LOCATION${ffmpeg_lib_dir}/libavcodec.so )add_library( avfilterSHAREDIMPORTED)set_target_properties( avfilterPROPERTIES IMPORTED_LOCATION${ffmpeg_lib_dir}/libavfilter.so )add_library( swscaleSHAREDIMPORTED)set_target_properties( swscalePROPERTIES IMPORTED_LOCATION${ffmpeg_lib_dir}/libswscale.so ) ​add_library( avformatSHAREDIMPORTED)set_target_properties( avformatPROPERTIES IMPORTED_LOCATION${ffmpeg_lib_dir}/libavformat.so ) ​add_library( avdeviceSHAREDIMPORTED)set_target_properties( avdevicePROPERTIES IMPORTED_LOCATION${ffmpeg_lib_dir}/libavdevice.so ) ​# 查找代码中使用到的系统库find_library( # Sets the name of the path variable.log-lib ​# Specifies the name of the NDK library that# you want CMake to locate.log ) ​# 配置目标so库编译信息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).native-lib.cpp) ​# 指定编译目标库时cmake要链接的库 target_link_libraries( ​# 指定目标库native-lib 是在上面 add_library 中配置的目标库native-lib ​# 4. 连接 FFmpeg 相关的库avutilswresampleavcodecavfilterswscaleavformatavdevice ​# Links the target library to the log library# included in the NDK.${log-lib} ) 主要看看注释中新加入的 14 点。 1通过 set 方法定义了 so 和 头文件 所在目录方便后面使用。 其中  CMAKE_SOURCE_DIR 为系统变量指向  CMakeLists.txt 所在目录。  ANDROID_ABI 也是系统变量指向 so 对应的  CPU 框架目录armeabi、armeabi-v7a、x86 ... set(ffmpeg_lib_dir ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}) set(ffmpeg_head_dir ${CMAKE_SOURCE_DIR}/ffmpeg) 2通过 include_directories 设置头文件查找目录 include_directories(${ffmpeg_head_dir}/include) 3通过 add_library 添加 FFmpeg 相关的 so 库以及 set_target_properties 设置 so 对应的目录。 其中add_library 第一个参数为 so 名字 SHARED 表示引入方式为动态库引入。 add_library( avcodecSHAREDIMPORTED )set_target_properties( avcodecPROPERTIES IMPORTED_LOCATION${ffmpeg_lib_dir}/libavcodec.so ) 4最后通过 target_link_libraries 把前面添加进来的 FFMpeg so 库都链接到目标库 native-lib 上。 这样我们就将 FFMpeg 相关的 so 库都引入到当前工程中了。下面就要来测试一下是否可以正常调用到 FFmpeg 相关的方法了。 三、使用 FFmpeg 要检查 FFmpeg 是否可以使用可以通过获取 FFmpeg 基础信息来验证。 1. 在 FFmpegAcrtivity 中添加一个外部方法 ffmpegInfo 把获取到的 FFmpeg 信息显示出来。 class FFmpegActivity: AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_ffmpeg_info) ​tv.text ffmpegInfo()} ​private external fun ffmpegInfo(): String ​companion object {init {System.loadLibrary(native-lib)}}} 2. 在 native-lib.cpp 中添加对应的 JNI 层方法 #include jni.h#include string#include unistd.hextern C {#include libavcodec/avcodec.h#include libavformat/avformat.h#include libavfilter/avfilter.h#include libavcodec/jni.h ​JNIEXPORT jstring JNICALLJava_com_cxp_learningvideo_FFmpegActivity_ffmpegInfo(JNIEnv *env, jobject /* this */) { ​char info[40000] {0};AVCodec *c_temp av_codec_next(NULL);while (c_temp ! NULL) {if (c_temp-decode ! NULL) {sprintf(info, %sdecode:, info);switch (c_temp-type) {case AVMEDIA_TYPE_VIDEO:sprintf(info, %s(video):, info);break;case AVMEDIA_TYPE_AUDIO:sprintf(info, %s(audio):, info);break;default:sprintf(info, %s(other):, info);break;}sprintf(info, %s[%10s]\n, info, c_temp-name);} else {sprintf(info, %sencode:, info);}c_temp c_temp-next;}return env-NewStringUTF(info);}}首先我们看到代码被包裹在 extern C { } 当中和前面的系统创建的稍微有些不同通过这个大括号包裹我们就不需要每个方法都添加单独的 extern C 开头了。 另外由于 FFmpeg 是使用 C 语言编写的所在 C 文件中引用 #include 的时候也需要包裹在 extern C { }才能正确的编译。 方法的新建就不用说了和前面介绍的命名方法一致。 在方法中使用 FFmpeg 提供的方法 av_codec_next获取到 FFmpeg 的编解码器然后通过循环遍历将所有的音视频编解码器信息拼接起来最后返回给 Java 层。 至此FFmpeg 加入到工程中并被调用。 如果一切正常App运行后就会显示出 FFmpeg 音视频编解码器的信息。 原文 Android音视频 引入FFmpeg - 掘金
http://www.zqtcl.cn/news/671075/

相关文章:

  • 中山快速做网站价格网站投稿源码
  • 免费网站建设教程青岛网站建设收费哪个平台好
  • 关于网站建设外文文献金蝶软件多少钱一套
  • 有高并发量门户网站开发经验国家商标局官网查询
  • 正规的招聘网站可信网站标志
  • 网站举报能不能查到举报人佛山企业网站建设电话
  • 家居网站建设如何现在去长沙会被隔离吗
  • 电子烟网站建设win2008iis7配置网站
  • 做网站的是什么职业微信公众号模板素材网站
  • 重庆川九建设有限责任公司官方网站成都网站海口网站建设
  • 珠宝 网站模板如何做公司官网
  • 贵阳网站制作免费iis7.5网站权限配置
  • 温州网站建设专业的公司移动互联网开发学什么专业
  • 集团企业网站建设方案运动服饰网站建设项目规划书
  • 简述网站建设的一般步骤简约的网站建设
  • wordpress删除用户头像昆明做网站优化的公司
  • 西安响应式网站网页设计的模板
  • 古装衣服店网站建设页面网站执行速度
  • 哪里的网站建设哈尔滨网络优化推广公司
  • 给网站做友情链接凡科网干嘛的
  • 网站经常出现502牧星网站建立
  • 个人网站建设的收获dw网站导航怎么做
  • 徐州网站设计快速排名网站
  • dede手机网站跳转口碑营销平台
  • 开一个素材设计网站怎么做的网页传奇手机版
  • 网站开发后端框架什么意思树莓派3 部署wordpress
  • 站长之家最新域名查询合肥网站建设5k5
  • h5做网站什么软件北京公司注销流程及费用
  • 淮北市相山区建设局网站合肥比较好的网站制作
  • 松岗营销型网站建设公司网站需要服务器吗