附上编译好的android ndk-FFmpeg库:

https://github.com/codeinmyself/FFmpegInAndroid

以及Ubuntu下编译运行的脚本:

https://github.com/codeinmyself/build.sh

建议初学者:

①在build.gradle中不要另起炉灶,建议保留下面:


注释的部分是设置jniLibs的路径,这样徒增复杂,不如保留默认路径(如下):


让系统自己去加载。其中jniLibs文件下面展示如下:


armeabi保存.so文件,include保存.h头文件。

②build.gradle中,下图表示适配的CPU架构:


这决定你的手机是否能运行这个应用,armeabi是目前适配最好的架构(但是android studio自带的AVD即使能兼容armeabi(sdk=5),也无法兼容你程序的minSDK(=15),因此最好用真机测试),广泛使用的是armeabi-v7a。

③CMakeList的建议:

建议CMakeList不要写死路径,尽量用系统设置的文件路径变量来代替,比如:


这样当有多个android_abi时也可以省点心。

④出现应用闪退:

log日志中虽然没有报红色错误,但是可以看到有bug:

No implementation found for native Lcom/dgut/android/MainActivity;.stringFromJNI ()Ljava/lang/String;

这个是对应的native-lib.cpp写错,

一般来说:应用一个c++函数其结构如下:(三部分)


相关探讨:http://blog.csdn.net/greenapple_shan/article/details/38504305

⑤关于如何在android项目中引用c++头文件和so库,下面链接的博客讲的很详细了:

https://www.cnblogs.com/guoguibiao/p/8281664.html

⑥如果没有在CMakeList中添加下面这句话,就会出现c++头文件中的引用找不到:

include_directories(src/main/cpp/include)

你会发现,头文件中的引用,如:

#include "libavutil/samplefmt.h"
应该写成:

#include "../libavutil/samplefmt.h"
但是每个编译好的c++库都是这样写的,如下图:


这里其实就是用到了共享库的概念,要不然得一个个添加“../”。

include_directories(src/main/cpp/include)
上面就是用CMake添加共享库。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐