Android Studio 2.1.1 中使用直接JNI与间接编译JNI
来源:互联网 发布:美工设计职责 编辑:程序博客网 时间:2024/06/07 15:57
最近在研究消除回音的问题,这个问题确实很头大.
网上很多人推荐用 Speex 与 WebRtc. 现在google好象关闭了WebRtc的下载了.
在学习 Speex的时候,会遇到移植的问题,即需要JNI相关知识.
下面介绍 如何使用 Android Studio 直接编译.
由于Android Studio默认不支持直接编译 JNI,
所以需要作一些修改.首先需要下载一些插件
点击打开链接
我下载的是 gradle-experimental:0.7.0-alpha4
只需要下载下面两文件
gradle-experimental-0.7.0-alpha4.jar
gradle-experimental-0.7.0-alpha4.pom
然后将这两文件放在 以下目录,当然这个根据 IDE安装位置变化而变化.C:\Program Files\Android\Android Studio\gradle\m2repository\com\android\tools\build\gradle-experimental参照已有格式存放.如下图
要使用jni,当然离不了 NDK的支持, Android Studio 2.1.1 需要的NDK比较新,建议使用 R11c以后版本
准备工作做好以后.下面正式开始.
第一步.
在IDE工具上面 File -> Settings -> Build,Execution,Deployment->Build Tools -> Gradle 页面 选择 Use default gradle wrapper (recommended)
第二步
修改 带项目名字的 build.gradle
classpath 'com.android.tools.build:gradle:2.1.0'
替换为
classpath 'com.android.tools.build:gradle-experimental:0.7.0-alpha4'
第三步.
修改 build.gradle(Module:app) 参照以下内容 把注释内容反注释,相应的重复内容注释掉
//apply plugin: 'com.android.model.application'apply plugin: 'com.android.application'//model {android { compileSdkVersion 23 buildToolsVersion "23.0.3" defaultConfig { applicationId "ash.webrtc"// minSdkVersion.apiLevel = 16 minSdkVersion 19// targetSdkVersion.apiLevel = 23 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'// proguardFiles.add(file("proguard-rules.pro")) } } sourceSets { main { jni.srcDirs = ['src/main/jni'] //直接编译需要此行,否则[]时面应该为空 jniLibs.srcDirs = ['src/main/jni/libs'] // 直接编译 此行[]里面应该为空,否则此行[]内容根据修改到指定位置. } }}// android.ndk {// platformVersion = 21// moduleName = "speex"// toolchain = 'clang'//// CFlags.add("-I" + file("src/main/jni").toString());// CFlags.add("-I" + file("src/main/jni/libwebrtc").toString());// CFlags.add("-I" + file("src/main/jni/libwebrtc/aec/interface").toString());// CFlags.add("-I" + file("src/main/jni/libwebrtc/audio_processing/utility").toString());// CFlags.add("-I" + file("src/main/jni/libwebrtc/system_wrappers/interface").toString());// CFlags.add("-I" + file("src/main/jni/libwebrtc/signal_processing/include").toString());// CFlags.add("-I" + file("src/main/jni/libwebrtc/utility").toString());// <span style="font-family: 宋体; font-size: 9pt; background-color: rgb(255, 255, 255);">ldLibs.add(</span><span style="font-family: 宋体; font-size: 9pt; color: rgb(0, 128, 0); "><strong>"log"</strong></span><span style="font-family: 宋体; font-size: 9pt; background-color: rgb(255, 255, 255);">)</span>// abiFilters.addAll(['armeabi', 'armeabi-v7a'])//// /*// * Other ndk flags configurable here are// * cppFlags += "-fno-rtti"// * cppFlags += "-fno-exceptions"// * ldLibs = ["android", "log"]// * stl = "system"// */// }//}dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.4.0' compile 'com.android.support:design:23.4.0'}
第三步.根据情况. 由于
gradle-experimental:0.7.0-alpha4 需要 gradle-2.10以上版本,所以需要修改你的 gradle/wrapper/gradle-wrapper.properties 文件内容
如下.
最后点击 做同步动作.
到此 整个修改的地方已经完成
题外话, 直接使用ide编译,在jni目录是不需要 Android.mk Application.mk等文件的的.
另外 由于你的jni里面可能有网上下载的一些library source 所以在编译的时候,会提示一些头文件找不到之类的.
IDE会有类似JAVA code一样,使用 ALT+Enter 修正.
你也可以使用如上面
CFlags.add("-I" + file("src/main/jni").toString());
这样的方式将头文件的目录添加进去.
第二种方法 直接使用命令行的NDK编译. 这个网上资料太多,就不多说了.
- Android Studio 2.1.1 中使用直接JNI与间接编译JNI
- Android studio 中使用Jni
- JNI使用实例:Android Studio使用JNI编译so库
- Android Studio使用CMake编译JNI初探
- android studio JNI使用
- Android Studio使用JNI
- android studio使用jni
- Android Studio 使用JNI
- ANDROID STUDIO JNI使用
- Android studio 使用jni
- Android studio 使用jni
- Android studio中如何使用Ndk(Jni)?
- Android Studio 中使用JNI的步骤
- 在Android Studio中使用Jni
- Android Studio中使用NDK/JNI
- Android Studio中jni的使用
- Android Studio中使用NDK/JNI
- 【笔记】Android Studio中使用NDK-JNI
- Action class [] not found - action - file:/...:/.../.metadata/.plugins/org.ec
- 安卓时间工具类,计算时间差,比较当前时间
- docker背后的namespaces
- 移动网络简介与RRC
- 数据库原理(上)--收集得空看
- Android Studio 2.1.1 中使用直接JNI与间接编译JNI
- ViewPager+Fragment LazyLoad最优解
- iOS Animation各种动画效果
- [DBunit] 1,DBunit简单入门
- Docker 入门教程(八)
- 本地如何搭建IPv6环境测试你的APP
- 430_AD采样不准确问题
- poj 1330 Nearest Common Ancestors lca rmq在线算法
- qt4连接mysql(2)