更新(2015.07.24):本文說的方法是針對(duì)Android Studio 1.3 之前的版本,,從 AS 1.3 開始,官方支持了 NDK 的開發(fā),,可以參考這里,。


之前有人問到怎么使用Android Studio進(jìn)行NDK開發(fā),經(jīng)過網(wǎng)上搜索,,自己也嘗試了一下,,用Android Studio進(jìn)行NDK開發(fā)比Eclipse更加靈活方便。

以下是翻譯自NDK With Android Studio這篇文章,。

在ADT中進(jìn)行NDK開發(fā)非常簡(jiǎn)單,,在Android Studio進(jìn)行NDK開發(fā)也同樣的容易。NDK開發(fā)主要有兩中情況:一種是使用已經(jīng)編譯好的.so動(dòng)態(tài)庫,;一種是使用c/c++源代碼開發(fā),。下面分別介紹。

使用預(yù)編譯好的.so動(dòng)態(tài)庫

你可以先用ndk-build工具先編譯好.so,,然后在Android Studio中引用,。 這種情況比較件簡(jiǎn)單,只要把的.so文件放到相應(yīng)的目錄即可,。如下所示:

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

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

現(xiàn)在就可以在代碼中直接載入此庫了,,如下:

String libName = "helloNDK"; // 庫名, 注意沒有前綴lib和后綴.so  
System.loadLibrary( libName );  

如果你不想把.so放在上面的默認(rèn)路徑,可以在buid.gradle中進(jìn)行如下配置:

android {  
  // .. android settings ..
  sourceSets.main {
      jniLibs.srcDir 'src/main/myCppLibraries' // <-- 你的.so庫的實(shí)際路徑
      }
}

在Android Studio編譯C/C++源代碼

如果你不想像上面那樣,,在終端中用ndk-build編譯.so,,然后回到Android Studio中寫Java代碼??梢灾苯幼孉ndroid 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還可以配置更多選項(xiàng),如下:

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++源代碼

默認(rèn)情況下,,你需要把C/C++源代碼放在[module]/src/main/jni/路徑下,。效果如下圖所示: jniSrcPath

當(dāng)然,你也可以自定義源代碼路徑:

android {

  // .. android settings ..

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

4.分平臺(tái)配置編譯(可選)

這一步不是必須的,,你可以根據(jù)需要,,對(duì)各個(gè)平臺(tái)進(jìn)行不同的編譯配置,可以設(shè)置覆蓋前面的編譯選項(xiàng)(例如cFlags),。例如你只想編譯指定平臺(tái)的.so,而不是所有的平臺(tái),。如下:

android {

  // .. android settings ..

  productFlavors {
        x86 {
            ndk {
                abiFilter "x86"
            }
        }
        arm {
            ndk {
                abiFilter "armeabi-v7a"
            }
        }
        mips {
            ndk {
                abiFilter "mips"
            }
        }
    }