最近在研究牛逼的视频库ffmpeg 在Android上的应用。查找各路大神的博客,终于可以在eclipse的项目中略施一二技能。但是公司项目是用的android studio。项目的文件结构都不一样,直接从eclipse上copy过时肯定不能的。所以又研究了一下android studio下的jni的试用。
我是从两篇文章上参照出来的,先把网址贴出来:
http://www.cnblogs.com/flyme/p/4431762.html
http://blog.yikuyiku.com/?tag=android
在eclipse是靠Android.mk这么个mk文件来组织编译的,但到android studio上就不行了,因其是靠gradle组织,所以makefile里的配置要转换为build.gradle里的语句。
如果是已经编好的so文件,直接导入到main文件夹下与Java文件夹同层级的jniLibs文件夹(没有的话,新建一个文件夹)下即可。
另一种情况,需要自己编译so文件,这一种完全与eclipse不同的体验。
1.首先ndk需要n9以上版本。可以在studio上直接下载,可能需要翻墙。如图;
2.ndk搞好后进行后续操作,
配置ndk.dir
在 local.properties 添加如下配置:(打开文件后发现已经配好了,此步自动略过吧)
sdk.dir=android-sdk的路径
ndk.dir=android-ndk的路径
3.重头戏,配置build.gradle
- android {
- compileSdkVersion 21
- buildToolsVersion "21.1.1"
- sourceSets.main.jni.srcDirs = [] // 禁用自动执行ndk-build
- defaultConfig {
- applicationId "com.example.chengang.myapplication"
- minSdkVersion 15
- targetSdkVersion 21
- versionCode 1
- versionName "1.0"
- ndk {//让gradle知道ndk的配置
- abiFilter "armeabi"//so文件的平台
- moduleName "ovsplayer" // 这个是C文件的名字
- ldLibs "log", "z"//一些库,对应android.mk文件中 LOCAL_LDIBS那一行 具体看下图。
- }
- }
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
- }
android {
compileSdkVersion 21
buildToolsVersion "21.1.1"
sourceSets.main.jni.srcDirs = [] // 禁用自动执行ndk-build
defaultConfig {
applicationId "com.example.chengang.myapplication"
minSdkVersion 15
targetSdkVersion 21
versionCode 1
versionName "1.0"
ndk {//让gradle知道ndk的配置
abiFilter "armeabi"//so文件的平台
moduleName "ovsplayer" // 这个是C文件的名字
ldLibs "log", "z"//一些库,对应android.mk文件中 LOCAL_LDIBS那一行 具体看下图。
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
4.需要通过Native类编译后的文件生成头文件。但是这个编译后的文件所在位置与eclipse的不同,在这个位置 app_path/build/intermediates/classes/debug下。然后生成头文件的命令是:javah -d jni -classpath E:\AndroidIDE\an
droidStdioSpace\Toge\ta\build\intermediates\classes\debug com.toge.ta.Native(在module根目录下执行。红色部分是你的module的debug的目录)
5.编写c文件 $ROOT_DIR/app/src/main/jni/ovsplayer.c内容同eclipse,此处不再讲
6.编写android.mk文件 Android.mk放到$ROOT_DIR/app/build/intermediates/ndk/debug/下。(注意,$root_dir表示的是preject的根目录)Android.mk文件的内容与eclipse中的不同,一下是studio中的mk文件,请自行勘察与eclipse中的异同
# Program
include $(CLEAR_VARS)
LOCAL_MODULE := zuoff
LOCAL_SRC_FILES :=E:\AndroidIDE\androidStdioSpace\Toge\ta\jni\ffmpeg_jni.c E:\AndroidIDE\androidStdioSpace\Toge\ta\jni\ffmpeg_mod.c E:\AndroidIDE\androidStdioSpace\Toge\ta\jni\ffmpeg_opt.c E:\AndroidIDE\androidStdioSpace\Toge\ta\jni\ffmpeg_filter.c E:\AndroidIDE\androidStdioSpace\Toge\ta\jni\cmdutils.c
#LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
LOCAL_C_INCLUDES += E:\AndroidIDE\androidStdioSpace\Toge\ta\jni
#LOCAL_C_INCLUDES += E:\AndroidIDE\androidStdioSpace\Toge\ta\src\debug\jni
LOCAL_LDLIBS := -llog -lz
LOCAL_SHARED_LIBRARIES := avcodec avdevice avfilter avformat avutil postproc swresample swscale
include $(BUILD_SHARED_LIBRARY)
简单说下LOCAL_LDLIBS和LOCAL_SHARED_LIBRARIES的区别,前者链接系统库,后者链接第三方库。
并不能换着用。
7.编译生成so文件
你的ndk目录/ ndk - build
NDK_PROJECT_PATH = null
APP_BUILD_SCRIPT =你的preject目录 / app / build / intermediates / ndk / debug / Android . mk
APP_PLATFORM = android - 21
NDK_OUT =你的preject目录 / app / build / intermediates / ndk / debug / obj
NDK_LIBS_OUT = 你的preject目录 / app / build / intermediates / ndk / debug / lib APP_ABI = armeabi
这就完事。