热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

最近在研究牛逼的视频库ffmpeg在Android上的应用。查找各路大神的博客,终于可以在eclipse的项目中略施一二技能。但是公司项目是用的andr


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

[java] view plain copy print?
  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 -classpathE:\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/libAPP_ABI=armeabi

这就完事。


推荐阅读
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • 本文详细介绍了如何在Java Web服务器上部署音视频服务,并提供了完整的验证流程。以AnyChat为例,这是一款跨平台的音视频解决方案,广泛应用于需要实时音视频交互的项目中。通过具体的部署步骤和测试方法,确保了音视频服务的稳定性和可靠性。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • 在处理大图片时,PHP 常常会遇到内存溢出的问题。为了避免这种情况,建议避免使用 `setImageBitmap`、`setImageResource` 或 `BitmapFactory.decodeResource` 等方法直接加载大图。这些函数在处理大图片时会消耗大量内存,导致应用崩溃。推荐采用分块处理、图像压缩和缓存机制等策略,以优化内存使用并提高处理效率。此外,可以考虑使用第三方库如 ImageMagick 或 GD 库来处理大图片,这些库提供了更高效的内存管理和图像处理功能。 ... [详细]
  • 本文对SQL Server系统进行了基本概述,并深入解析了其核心功能。SQL Server不仅提供了强大的数据存储和管理能力,还支持复杂的查询操作和事务处理。通过MyEclipse、SQL Server和Tomcat的集成开发环境,可以高效地构建银行转账系统。在实现过程中,需要确保表单参数与后台代码中的属性值一致,同时在Servlet中处理用户登录验证,以确保系统的安全性和可靠性。 ... [详细]
  • 本文详细探讨了Oracle数据库中Number和Float数据类型的特性和使用方法。通过对比分析,解释了Number类型在精度和范围上的优势,以及Float类型在处理科学计算时的灵活性。文章还介绍了Number数据类型的语法结构及其在实际应用中的最佳实践,帮助读者更好地理解和选择合适的数据类型以满足不同的业务需求。 ... [详细]
  • 本文深入探讨了WinRing0及其源代码实现,详细解析了如何通过获取Ring0权限在应用程序中直接执行需要Ring0权限的CPU指令。此外,文章还提供了实例截图和核心代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在Ubuntu系统中安装Android SDK的详细步骤及解决“Failed to fetch URL https://dlssl.google.com/”错误的方法
    在Ubuntu 11.10 x64系统中安装Android SDK的详细步骤,包括配置环境变量和解决“Failed to fetch URL https://dlssl.google.com/”错误的方法。本文详细介绍了如何在该系统上顺利安装并配置Android SDK,确保开发环境的稳定性和高效性。此外,还提供了解决网络连接问题的实用技巧,帮助用户克服常见的安装障碍。 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • 本文探讨了Android系统中支持的图像格式及其在不同版本中的兼容性问题,重点涵盖了存储、HTTP传输、相机功能以及SparseArray的应用。文章详细分析了从Android 10 (API 29) 到Android 11 的存储规范变化,并讨论了这些变化对图像处理的影响。此外,还介绍了如何通过系统升级和代码优化来解决版本兼容性问题,以确保应用程序在不同Android版本中稳定运行。 ... [详细]
  • 为了向用户提供虚拟应用程序,通常会在基础架构中部署StoreFront或Web Interface。为了确保安全的远程访问,通常需要在DMZ中配置Secure Gateway或Access Gateway。本文详细对比了这两种界面工具的功能特性,包括用户管理、安全性、性能优化等方面,为企业选择合适的解决方案提供了全面的参考。 ... [详细]
author-avatar
a52713849_937
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有