博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android studio上的jni编译流程以及Android.mk文件的处理
阅读量:2723 次
发布时间:2019-05-13

本文共 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

[java]
  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

这就完事。

你可能感兴趣的文章
springmvc学习笔记(四)访问静态资源
查看>>
springmvc学习笔记(五)开启注解
查看>>
springmvc学习笔记(六)注解优化
查看>>
springmvc学习笔记(七)数据传递及乱码问题
查看>>
springmvc学习笔记(八)json传递数据
查看>>
springmvc学习笔记(九)文件上传
查看>>
java综合(一)spring与struts2整合
查看>>
java综合(二)springmvc与spring整合
查看>>
java综合(三)springmvc与spring上下文关系
查看>>
java综合(四)spring与hibernate整合
查看>>
Hibernate学习之主键生成策略
查看>>
java综合(五)spring与hibernate整合-事务
查看>>
java综合(六)hibernate.current_session_context_class配置
查看>>
Mybatis学习笔记(一)入门例子
查看>>
Mybatis学习笔记(二)配置文件
查看>>
Log4j日志配置
查看>>
Log4j按级别输出到日志文件
查看>>
MyBatis学习笔记(四)一多一关系
查看>>
MyBatis学习笔记(五)一对多关系
查看>>
MyBatis学习笔记(六)动态sql
查看>>