Android Studio中NDK开发

来源:互联网 发布:生鲜品配送管理优化 编辑:程序博客网 时间:2024/04/27 18:19

转载自: http://www.tuicool.com/articles/NBjQny

之前有人问到怎么使用Android Studio进行NDK开发,经过网上搜索,自己也尝试了一下,用Android Studio进行NDK开发比Eclipse更加灵活方便。

以下是翻译自 NDK With Android Studio 这篇文章。

在ADT中进行NDK开发非常简单,在Android Studio进行NDK开发也同样的容易。NDK开发主要有两中情况:一种是使用已经编译好的.so动态库;一种是使用c/c++源代码开发。下面分别介绍。

使用预编译好的.so动态库

你可以先用ndk-build工具先编译好.so,然后在Android Studio中引用。 这种情况比较件简单,只要把的.so文件放到相应的目录即可。如下所示:

  • [module_name]
    • [src]
      • [main]
        • [jniLibs]
          • [armeabi]
          • [armeabi-v7a]
          • [x86]
          • [mips]

注意 jniLibs 目录是放在 module 下面,在Android Studio中效果如下:jniLibsPath

现在就可以在代码中直接载入此库了,如下:

String libName = "helloNDK"; // 库名, 注意没有前缀lib和后缀.so  System.loadLibrary( libName );  

如果你不想把.so放在上面的默认路径,可以在buid.gradle中进行如下配置:

android {    // .. android settings ..  sourceSets.main {    jniLibs.srcDir 'src/main/myCppLibraries' // <-- 你的.so库的实际路径    }}

在Android Studio编译C/C++源代码

如果你不想像上面那样,在终端中用ndk-build编译.so,然后回到Android Studio中写Java代码。可以直接让Android Studio帮你编译。配置方法如下:

1.配置 ndk.dir

在 local.properties 添加如下配置:

  sdk.dir=/path/to/android-sdk  ndk.dir=/path/to/android-ndk

2.Gradle配置NDK模块

android {    compileSdkVersion 19  buildToolsVersion "20.0.0"  defaultConfig {    applicationId "com.example.ndksample"    minSdkVersion 9    targetSdkVersion 19    versionCode 1    versionName "1.0"    ndk {      moduleName "helloNDK" // <-- This is the name of my C++ module!    }  }  // ... more gradle stuff here ...} // end of android section

ndk 还可以配置更多选项,如下:

ndk {    moduleName "myEpicGameCode"  cFlags "-DANDROID_NDK -D_DEBUG DNULL=0"   // Define some macros  ldLibs "EGL", "GLESv3", "dl", "log"   // Link with these libraries!  stl "stlport_shared"  // Use shared stlport library}

3.添加C/C++源代码

默认情况下,你需要把C/C++源代码放在 [module]/src/main/jni/ 路径下。效果如下图所示:jniSrcPath

当然,你也可以自定义源代码路径:

android {  // .. android settings ..  sourceSets.main {      jni.srcDirs 'src/main/source'  }}

4.分平台配置编译(可选)

这一步不是必须的,你可以根据需要,对各个平台进行不同的编译配置,可以设置覆盖前面的编译选项(例如 cFlags )。例如你只想编译指定平台的.so,而不是所有的平台。如下:

android {  // .. android settings ..  productFlavors {    x86 {      ndk {        abiFilter "x86"      }    }    arm {      ndk {        abiFilter "armeabi-v7a"      }    }    mips {      ndk {        abiFilter "mips"      }    }  }} // android

0 0
原创粉丝点击