android studio上的jni编译流程以及Android.mk文件的处理



最近在研究牛逼的视频库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

  1. android {  
  2.     compileSdkVersion 21  
  3.     buildToolsVersion "21.1.1"  
  4.    
  5.     sourceSets.main.jni.srcDirs = [] // 禁用自动执行ndk-build  
  6.     defaultConfig {  
  7.         applicationId "com.example.chengang.myapplication"  
  8.         minSdkVersion 15  
  9.         targetSdkVersion 21  
  10.         versionCode 1  
  11.         versionName "1.0"  
  12.         ndk {//让gradle知道ndk的配置  
  13.             abiFilter "armeabi"//so文件的平台  
  14.             moduleName "ovsplayer" // 这个是C文件的名字  
  15.             ldLibs "log""z"//一些库,对应android.mk文件中 LOCAL_LDIBS那一行 具体看下图。  
  16.         }  
  17.     }  
  18.     buildTypes {  
  19.         release {  
  20.             minifyEnabled false  
  21.             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  
  22.         }  
  23.     }  
  24. }  
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

这就完事。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值