参考 http://blog.csdn.net/zblue78/article/details/6058147 感谢 ExperiencesOfCode

硬件平台:CPU Intel G630 @2.7GHz,4GB内存

软件平台:Ubuntu 12.04, GCC4.6.3 , android-ndk-r8e ,  Android Developer Tools Build: v22.0.1-685705

1. 编译X264

下载最新版X264,x264-snapshot-20131209-2245-stable

编译选项为:

1. ~$ ./configure --enable-pic --enable-strip --enable-static --cross-prefix=/home/gong/android/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi- --sysroot=/home/gong/android/android-ndk-r8e/platforms/android-14/arch-arm --host=arm-linux --prefix=./build --extra-cflags="-march=armv7-a -mtune=cortex-a8 -mfloat-abi=softfp -mfpu=neon -D__ARM_ARCH_7__ -D__ARM_ARCH_7A__"

2. ~$ make STRIP=

3. ~$ make install

第二步如果不用STRIP=,就会报一个警告。

"cannot scan executable section 1 of libx264.a(dct-a.o) for Cortex-A8 erratum because it has no mapping symbols"

搜索得到的解决方法,详见http://code.google.com/p/android/issues/detail?id=40794。

STRIP的含义是当最终的可执行程序不需要包含调试信息时,可使用“strip”去掉可执行程序中的调试符号以减小最终的程序大小。configure的时候已经加了strip,这里make也要加。

2. 编译JNI

下载参考文档里面的工程。

将编译得到的build文件夹下三个文件夹替换原来工程/jni/libx264/里对应的文件夹。

在jni文件夹目录下运行

1. ~$ ndk-build clean

2. ~$ ndk-build

就得到了./lib/armeabi/libH264Android.so

3.  测试工程

eclipse clean工程以后。运行该工程。录制几秒钟,崩溃了。

4. 发现内存泄露

调试LOG显示,发现内存溢出,崩溃。位置大约在jni层。

查看./jni/目录下 H264Android.c

在方法jint Java_h264_com_H264Encoder_CompressBuffer 里,前面两次使用GetByteArrayElements,后面没有对应的release

jbyte * Buf = (jbyte*)(*env)->GetByteArrayElements(env, in, 0);
jbyte * h264Buf = (jbyte*)(*env)->GetByteArrayElements(env, out, 0);

修改方法:

在该方法return前面加上两句释放,就搞定了。

(*env)->ReleaseByteArrayElements(env, in, Buf, 0);

(*env)->ReleaseByteArrayElements(env, out, h264Buf, 0);

5. 修改完毕

运行正常,接下来就是调试分辨率和X264编码质量。然后就是稳定性和兼容性测试。

附上工程 H264AndroidEncoder

最新文章

  1. 浏览器请求URL原理
  2. iOS开发 - OC - 苹果为大家提供的后台:CloudKit 的简单使用
  3. html5 浏览器端数据库
  4. 再谈HTML
  5. C# winform 若要在加载设计器前避免可能发生的数据丢失,必须纠正以下错误
  6. C++ Brush
  7. logstash-input-file 参数说明
  8. Do's and Don'ts for Android development
  9. 微信5.0 Android版飞机大战破解无敌模式手记
  10. ASP.NET关于Login控件使用,LoginView 控件,CreateUserWizard 控件
  11. C语言面试问答5
  12. 面试之MySQL基本命令
  13. 微软认知服务 Luis
  14. vue drag 对表格的列进行拖动排序
  15. 【转载】 [unreal4入门系列之七] UE4中的Actor类和Pawn类
  16. JavaScript学习-5——异步同步、回调函数
  17. eXosip sip
  18. Win10系列:C#应用控件基础8
  19. [LeetCode] 704. Binary Search_Easy tag: Binary Search
  20. Jaxb如何优雅的处理CData

热门文章

  1. 数组有N+M个数字, 数字的范围为1 ... N, 打印重复的元素, 要求O(M + N), 不可以用额外的空间
  2. Ubuntu启动停止在checking battery state...
  3. NGUI系列教程六(技能冷却的CD效果)
  4. SIAlertView
  5. JavaScript decodeURI() 和 encodeURI() 函数
  6. CSS的绝对定位和相对定位
  7. UINavigationController使用的注意事项
  8. Nuget
  9. js中replace用法
  10. JAVA信号量使用示例程序