本文共 3452 字,大约阅读时间需要 11 分钟。
最近在研究牛逼的视频库ffmpeg 在上的应用。查找各路大神的博客,终于可以在eclipse的项目中略施一二技能。但是公司项目是用的 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文件夹下与文件夹同层级的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' } }}
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文件
这就完事。