Android Studio 2.1.1 中使用直接JNI与间接编译JNI

翻译 2016年06月01日 14:31:34

最近在研究消除回音的问题,这个问题确实很头大.

网上很多人推荐用 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编译. 这个网上资料太多,就不多说了.

NDK-JNI实战教程(一) 在Android Studio运行第一个NDK程序

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN。因为CSDN也支持MarkDown语法了,牛逼啊!NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西;另...
  • yanbober
  • yanbober
  • 2015年04月27日 13:23
  • 87860

Android Studio基础之编译JNI(七)-学习篇

这篇里学习下如何使用NDK来编译项目里的JNI工程。要使用NDK首先我们来配置好NDK的路径。 再来,打开项目中的local.properties文件看看,这个文件作为本地的一个配置文件,可以不...
  • wx198210
  • wx198210
  • 2015年12月25日 16:30
  • 805

Android Studio开发JNI工程

使用Android Sutdio创建一个新的工程后,接下来记录创建NDK工程的基本步骤。本文将达到:1. 创建NDK工程2. 在JNI中输出Log语句3. 指定编译的so库的abi版本4. 解决在创建...
  • sodino
  • sodino
  • 2014年12月15日 18:49
  • 106853

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

最近在研究牛逼的视频库ffmpeg 在android上的应用。查找各路大神的博客,终于可以在eclipse的项目中略施一二技能。但是公司项目是用的android studio。项目的文件结构都不一样,...
  • zrbcsdn
  • zrbcsdn
  • 2015年09月11日 16:34
  • 5983

Android JNI编程(七)——使用AndroidStudio编写第一个JNI程序

1.简单介绍一下NDK和JNI NDK:NDK是Native Development Kit的缩写,是Google提供的一套工具集,可以让你其他语言(C、C++或汇编)开发 Android的 JNI。...
  • a_zhon
  • a_zhon
  • 2016年11月09日 12:44
  • 4677

Android Studio基础之编译JNI(七)-学习篇

这篇里学习下如何使用NDK来编译项目里的JNI工程。要使用NDK首先我们来配置好NDK的路径。 再来,打开项目中的local.properties文件看看,这个文件作为本地的一个配置文件,可以不...
  • wx198210
  • wx198210
  • 2015年12月25日 16:30
  • 805

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

最近在研究牛逼的视频库ffmpeg 在android上的应用。查找各路大神的博客,终于可以在eclipse的项目中略施一二技能。但是公司项目是用的android studio。项目的文件结构都不一样,...
  • zrbcsdn
  • zrbcsdn
  • 2015年09月11日 16:34
  • 5983

Android studio jni编译以及第三方so库的引用

本编译环境在 androidstudio2.0 以上。 一下为build.gride文件 android { compileSdkVersion 22 buildTools...
  • sinde12
  • sinde12
  • 2016年07月28日 19:26
  • 976

android studio 2.0下 jni开发环境的搭建

快过年了 ,程序猿都比较闲今天分享下载as 2.0 下 jni开发环境的搭建  as从1.3版本开始比较完善的支持c代码的开发,但是如何在这个环境下配置c进行开发的资料真是少的可怜,我通过看官方的英文...
  • u012436608
  • u012436608
  • 2016年02月03日 16:49
  • 814

Android Studio下JNI编程(引入外部或AS自行编译so文件)

1. 引用外部so文件 已验证过的引用外部so文件主要有三种方式: 1.1  main目录下创建jniLibs目录,so文件按平台存放于子目录下(最简单方式) 只需在app/src/...
  • hzxyliugang
  • hzxyliugang
  • 2017年04月06日 19:38
  • 327
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android Studio 2.1.1 中使用直接JNI与间接编译JNI
举报原因:
原因补充:

(最多只允许输入30个字)