第五章 Android自定义so文件调用ffmpeg.so详解.docVIP

  • 2
  • 0
  • 约1.79千字
  • 约 18页
  • 2017-06-15 发布于北京
  • 举报

第五章 Android自定义so文件调用ffmpeg.so详解.doc

Android自定义so文件调用ffmpeg.so详解 在使用一下介绍内容时候,我认为所有读者都已具备一下水平: 会建立android项目工程 了解NDK编程入门知识 已成功编译或在网上已下载到ffmpeg.so动态库文件 我自己成功编译ffmpeg.so文件:使用vitamio提供的.sh脚本文件在linux环境下编译的,编译过程此处略去一万字… 1、在NDK的samples下建立android工程,此处我建立的是HelloFFmpeg,如下图: 2、编写本地函数声明,NDK的samples目录下有一个hello-jni的例子: 使用UltraEdit打开HelloJni.java文件: 将该文件的的一下内容拷贝到HelloFFmpeg工程的MainActivity.java的相应位置: (1)、拷贝onCreate中的内容: (2)、拷贝本地函数声明: (3)、拷贝库文件加载: 打开拷贝完成的HelloFFmpeg工程下的MainActivity.java文件,如下: 生成本地.h头文件: 新建立jni目录: 在jni目录下建立再建立jni目录 这里通过cmd进入第二个jni目录: 输入以下内容生成.h头文件: 此时会报错,因为咱们的本地函数和本地库的引用均在主类MainActivity中声明引用的,一般重新创建一个类进行声明引用的时候是不会出错的。但此时我给大家提供一个解决该错误的方法: 进入src目录中,使用下面的语句: 其中: -d:代表.h所在的目录,如果目录不存在,则自动创建一个 ../jni/jni:代表上级目录中的jni目录,.h文件将存放在此处 在工程上刷新,就出现.h头文件了: 创建.c文件 在c文件中包含刚才生成的头文件,并将头文件的函数声明部分拷贝到c文件中: 包含头文件 先给大家看看我使用vitamio生成库文件后的文件目录: 所有的so库都在build文件夹中 该文件夹中包含了支持不同cpu特性的so库 我使用armv7的so库 在工程jni目录下建立include目录 将armv7/include下的文件夹全部拷贝到工程下的include文件夹下 在c文件中包含头文件 包含ffmpeg.so动态库 (1)建立pretuilt目录,并将ffmpeg.so拷贝进去 在prebuilt下建立Android.mk文件 内容如下 (2)在jni目录下建立Android.mk文件 内容如下 在jni/jni目录下建立Android.mk文件 内容如下 参数说明: LOCAL_C_INCLUDES:为包含头文件目录,前面留空白区域不是空格,是按Tab键生成的,这个一定要注意,不然交叉编译时候会出错 LOCAL_SHARED_LIBRARIES:为共享库,此处为全称libffmpeg LOCAL_MODULE:MainActivity中声明引用的hello-jni LOCAL_SRC_FILES:c源文件名 编写c文件,内容如下,此函数返回ffmpeg版本号 修改include头文件 当直接交叉编译以上内容时会报错,提示找不到某某.h文件,原因是include文件夹中的.h头文件调用逻辑问题,导致交叉编译时找不到头文件 例如libavcodec/avcodec.h头文件中: 将所有没有包含在libavcodec目录下的头文件引用路径全部修改,修改后如下: 依照以上步骤,检查所有的头文件引用,以防编译出错 10、交叉编译 (1) 打开Cywin,进入到工程目录下 (2)编译 输入../../ndk-build进行编译 Oh my god!出现了以上错误,现在你是否要崩溃了,别急,现在使用以下方法: 在工程路径下: 输入:cd obj/local/armeabi 输入:chmod 777 ./* (注:上面的错误的结果是没有生成libs文件,但生成了obj文件,因此改这个错误的时候obj不要删) 刷新工程,出现so文件 此时运行程序,会报错,究其原因,是因为MainActivity中未包含ffmpeg动态库文件,修改MainActivity如下 重新编译成功,如下图: 刷新工程,此时libs下便出现了两个so动态库: 此时重新运行工程,将打印ffmpeg版本号,如下图: 此处再次省略一万字…

文档评论(0)

1亿VIP精品文档

相关文档