网上资料很多,我拿一个通用的模板出来,特别是重新编译别人写好的jni代码
单独一个so生成:
/Users/mier/Library/Android/sdk/ndk-bundle/ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=./jni/Application.mk NDK_LIBS_OUT=./jniLibs
说明:
/Users/mier/Library/Android/sdk/ndk-bundle/ndk-build 是我下载好的 NDK 目录路径
NDK_PROJECT_PATH 指定项目路径, 会自动读取这个目录下的 jni/Android.mk 文件
NDK_APPLICATION_MK 指定 Application.mk 的位置
NDK_LIBS_OUT 指定将生成的 .so 文件放到哪个目录,默认 Android Studio 会读取 jniLibs 目录下的 .so 文件, 所以我们把 .so 文件生成到这
多个so一起生成的:
1,注意配置NDK的路径到环境变量,不然会报找不到ndk-build命令;
2,app目录下的build.gradle加上下面通用方法;
import org.apache.tools.ant.taskdefs.condition.Os
def getNdkBuildName() {
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
return "ndk-build.cmd"
} else {
return "ndk-build"
}
}
def getNdkBuildFullPath() {
// we allow to provide full path to ndk-build tool
if (hasProperty('ndk.command')) {
return property('ndk.command')
}
// or just a path to the containing directiry
if (hasProperty('ndk.path')) {
def path = property('ndk.path')
if (!path.endsWith(File.separator)) {
path += File.separator
}
return path + getNdkBuildName()
}
// if none of above is provided, we assume ndk-build is already in $PATH
return getNdkBuildName()
}
def makeNdkTasks(String name, Object[] deps) {
task "ndk_build_$name"(dependsOn: deps, type: Exec) {
inputs.file("src/main/jni/$name")
outputs.dir("$buildDir/$name")
commandLine getNdkBuildFullPath(),
'NDK_PROJECT_PATH=null',
'NDK_APPLICATION_MK=../Application.mk',
'NDK_OUT=' + temporaryDir,
"NDK_LIBS_OUT=$buildDir/$name",
'-C', file("src/main/jni/$name").absolutePath,
'--jobs', Runtime.getRuntime().availableProcessors()
}
task "ndk_clean_$name"(type: Exec) {
ignoreExitValue true
commandLine getNdkBuildFullPath(),
'NDK_PROJECT_PATH=null',
'NDK_APPLICATION_MK=../Application.mk',
'NDK_OUT=' + temporaryDir,
"NDK_LIBS_OUT=$buildDir/$name",
'-C', file("src/main/jni/$name").absolutePath,
'clean'
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn "ndk_build_$name"
}
clean.dependsOn "ndk_clean_$name"
}
特别注意:如果你Application.mk里面有配置NDK_TOOLCHAIN_VERSION (gcc编辑版本),那么要看好你本地NDK目录里toolchains目录里面是多少。
android {
def ndkLibs = [
['bitmaps', []],
['gifimage', []],
['memchunk', []]]
ndkLibs.each { lib -> makeNdkTasks lib[0], lib[1] }
}
再重新 ./gradlew build --info。
生成的so文件在build目录下 (实际也就是 “NDK_OUT” 下)