原文 https://baidumap.wordpress.com/2014/12/25/android-studio如何同ndk集成/
将native库(.so文件)集成到你的APK包
以前的方法是把.so放到.jar包里, 现在很简单了
在 src/main/ 目录下(该目录下有 java和res两个子目录), 创建一个 jniLibs 目录
再创建相应ABI子目录(如 x86, mips, armeabi-v7a, armeabi)
最后,把相应的so文件放入对应的目录即可
build时,所有的.so文件都会被集成到你的apk里
如果jniLibs这个目录不适合你(你可能生成你的.so文件放在其他地方), 你可以在build.gradle里指定位置
android {
...
sourceSets.main {
jniLibs.srcDir 'src/main/libs'
}
}
是在 模块目录下的 build.gradle里, 工程目录下的build.gradle里没有android {] 这个条目
有洁癖的人,喜欢为每个架构单独生成一个APK,这样, APK的体积会比较小
那就可以使用abiFilter这个属性, 这个属性默认是设置为 all, 将所有平台的.so都打包进apk
也是在build.gradle的android条目下添加一些东西
android{
...
productFlavors {
x86 {
ndk {
abiFilter "x86"
}
}
mips {
ndk {
abiFilter "mips"
}
}
armv7 {
ndk {
abiFilter "armeabi-v7a"
}
}
arm {
ndk {
abiFilter "armeabi"
}
}
fat
}
}
为不同的架构设置不同的版本号(方便google play store上架)
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)) }
决定是否调用ndk-build
如果在你的工程目录下面有jni/目录, 那么build系统将会试图 调用 ndk-build来自动生成.so文件
当前的实现是: 忽略你jni目录下的Android.mk这个makefile,然后自动创建一个新的
对于简单的工程来说,这真是太方便了(你根本就不需要自己创建*mk文件)
但是对于大工程来说,这就有点令人烦恼了, 因为你需要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
本文详细介绍了在Android Studio中如何将本地库(.so文件)集成到APK中。包括在src/main/目录下创建jniLibs目录及相应ABI子目录来存放不同架构的.so文件,通过修改build.gradle文件来指定.so文件的位置,并使用abiFilter属性为不同架构生成独立的APK。还介绍了如何通过配置避免自动调用ndk-build。
2687

被折叠的 条评论
为什么被折叠?



