Android StudioはどうやってNDKと一体化しますか?

3943 ワード

テキスト https://baidumap.wordpress.com/2014/12/25/android-studioどのようにndkと一体化しますか
nativeライブラリ(.soファイル)をあなたのAPKパッケージに統合します。
以前の方法は.soを.jarのカバンに入れます。今は簡単です。
Src/main/ディレクトリの下で、jniLibsディレクトリを作成して、対応するABIサブディレクトリ(x 86、mips、armeabi-v 7 a、armeabi)を作成します。最後に、対応するsoファイルを対応するディレクトリに入れてください。soファイルはすべてappleにまとめられます。
jniLibsというディレクトリがあなたに合わない場合(あなたが作成する可能性があります。そしてファイルを他のところに置いてください。)、あなたはbuild.gradleの中で位置を指定できます。
android {
    ...
    sourceSets.main {
        jniLibs.srcDir 'src/main/libs'
    }
}
モジュールディレクトリの下のbuild.gradleで、プロジェクトディレクトリの下のbuild.gradleにはandroid{”という項目がありません。
潔癖症の人は、各アーキテクチャのために単独でAPKを生成するのが好きです。そうすると、APKの体積は比較的小さいです。
abilifilterという属性を使うことができます。この属性はデフォルトではallに設定されています。すべてのプラットフォームのです。そして、全部appkに包装します。
build.gradleのandroidの項目の下にいくつかのものを追加します。
android{
  ...
  productFlavors {
        x86 {
            ndk {
                abiFilter "x86"
            }
        }
        mips {
            ndk {
                abiFilter "mips"
            }
        }
        armv7 {
            ndk {
                abiFilter "armeabi-v7a"
            }
        }
        arm {
            ndk {
                abiFilter "armeabi"
            }
        }
        fat
    }
}
異なるアーキテクチャのために異なるバージョン番号を設定します。
import java.util.regex.Pattern
 
android {
    ...
    defaultConfig{
        versionCode getVersionCodeFromManifest()
    }
    ...
    productFlavors {
        x86 {
            versionCode Integer.parseInt("6" + defaultConfig.versionCode)
            ndk {
                abiFilter "x86"
            }
        }
        mips {
            versionCode Integer.parseInt("4" + defaultConfig.versionCode)
            ndk {
                abiFilter "mips"
            }
        }
        armv7 {
            versionCode Integer.parseInt("2" + defaultConfig.versionCode)
            ndk {
                abiFilter "armeabi-v7a"
            }
        }
        arm {
            versionCode Integer.parseInt("1" + defaultConfig.versionCode)
            ndk {
                abiFilter "armeabi"
            }
        }
        fat
    }


}
 
def getVersionCodeFromManifest() {
    def manifestFile = file(android.sourceSets.main.manifest.srcFile)
    def pattern = Pattern.compile("versionCode=\"(\\d+)\"")
    def matcher = pattern.matcher(manifestFile.getText())
    matcher.find()
    return Integer.parseInt(matcher.group(1))
}


dk-buildを呼び出しますか?もしあなたのプロジェクトディレクトリの下にjni/ディレクトリがあれば、buildシステムはndk-buildを呼び出して自動的に生成します。soファイルの現在の実装は、jniディレクトリの下のAndroid.mkというmakefileを無視して、自動的に新しいプロジェクトを作成します。これは本当に便利です。しかし、大工事にとっては、Makefileが提供する機能が必要です。build.gradleファイルで禁止できます。
android{
    ...
    sourceSets.main.jni.srcDirs = [] //disable automatic ndk-build call
}
参考資料
http://www.flakor.cn/2014-02-07-198.html
http://www.nsdev.org/blog/2014/01/01/including-native-libraries-in-your-apk
http://stackoverflow.com/questions/21096819/jni-and-gradle-in-android-studio