如何在 Android Studio and/or gradle 中设置 NDK_MODULE_PATH?
How to set NDK_MODULE_PATH in Android Studio and/or gradle?
我正在将 Android 库从 Eclipse 迁移到 Android Studio。在 Eclipse 中,我可以通过 Project > Properties > Resource > Linked Resources > Path Variables 设置 NDK_MODULE_PATH。但是我如何在 Android Studio 中分别使用 gradle 实现同样的事情?
我的库一直在构建,直到它尝试为 NDK_MODULE_PATH 下的模块找到 headers。
错误信息如下:
Executing tasks: [:libAndroid:compileDebugSources, :physicaloidLibrary:compileDebugSources]
Configuration on demand is an incubating feature.
:libAndroid:preBuild UP-TO-DATE
:libAndroid:preDebugBuild UP-TO-DATE
:libAndroid:checkDebugManifest
:libAndroid:preDebugAndroidTestBuild UP-TO-DATE
:libAndroid:preReleaseBuild UP-TO-DATE
:physicaloidLibrary:compileLint
:physicaloidLibrary:copyReleaseLint UP-TO-DATE
:physicaloidLibrary:mergeReleaseProguardFiles UP-TO-DATE
:physicaloidLibrary:preBuild UP-TO-DATE
:physicaloidLibrary:preReleaseBuild UP-TO-DATE
:physicaloidLibrary:checkReleaseManifest
:physicaloidLibrary:prepareReleaseDependencies
:physicaloidLibrary:compileReleaseAidl UP-TO-DATE
:physicaloidLibrary:compileReleaseRenderscript UP-TO-DATE
:physicaloidLibrary:generateReleaseBuildConfig UP-TO-DATE
:physicaloidLibrary:generateReleaseAssets UP-TO-DATE
:physicaloidLibrary:mergeReleaseAssets UP-TO-DATE
:physicaloidLibrary:generateReleaseResValues UP-TO-DATE
:physicaloidLibrary:generateReleaseResources UP-TO-DATE
:physicaloidLibrary:packageReleaseResources UP-TO-DATE
:physicaloidLibrary:processReleaseManifest UP-TO-DATE
:physicaloidLibrary:processReleaseResources UP-TO-DATE
:physicaloidLibrary:generateReleaseSources UP-TO-DATE
:physicaloidLibrary:compileReleaseJava UP-TO-DATE
:physicaloidLibrary:processReleaseJavaRes UP-TO-DATE
:physicaloidLibrary:packageReleaseJar UP-TO-DATE
:physicaloidLibrary:compileReleaseNdk UP-TO-DATE
:physicaloidLibrary:packageReleaseJniLibs UP-TO-DATE
:physicaloidLibrary:packageReleaseLocalJar UP-TO-DATE
:physicaloidLibrary:packageReleaseRenderscript UP-TO-DATE
:physicaloidLibrary:bundleRelease UP-TO-DATE
:libAndroid:prepareLibAndroidGradlePhysicaloidLibraryUnspecifiedLibrary UP-TO-DATE
:libAndroid:prepareDebugDependencies
:libAndroid:compileDebugAidl UP-TO-DATE
:libAndroid:compileDebugRenderscript UP-TO-DATE
:libAndroid:generateDebugBuildConfig UP-TO-DATE
:libAndroid:generateDebugAssets UP-TO-DATE
:libAndroid:mergeDebugAssets UP-TO-DATE
:libAndroid:generateDebugResValues UP-TO-DATE
:libAndroid:generateDebugResources UP-TO-DATE
:libAndroid:mergeDebugResources UP-TO-DATE
:libAndroid:processDebugManifest UP-TO-DATE
:libAndroid:processDebugResources UP-TO-DATE
:libAndroid:generateDebugSources UP-TO-DATE
:libAndroid:compileDebugJava UP-TO-DATE
:libAndroid:compileDebugNdk
AGPBI: {"kind":"SIMPLE","text":"/home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/src/main/jni/imageprocessing/dmtxutil.c:30:18: fatal error: dmtx.h: No such file or directory","position":{},"original":"/home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/src/main/jni/imageprocessing/dmtxutil.c:30:18: fatal error: dmtx.h: No such file or directory"}
AGPBI: {"kind":"SIMPLE","text":" #include \u003cdmtx.h\u003e","position":{},"original":" #include \u003cdmtx.h\u003e"}
AGPBI: {"kind":"SIMPLE","text":" ^","position":{},"original":" ^"}
AGPBI: {"kind":"SIMPLE","text":"compilation terminated.","position":{},"original":"compilation terminated."}
AGPBI: {"kind":"SIMPLE","text":"make: *** [/home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/build/intermediates/ndk/debug/obj/local/arm64-v8a/objs/Rhodo//home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/src/main/jni/imageprocessing/dmtxutil.o] Error 1","position":{},"original":"make: *** [/home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/build/intermediates/ndk/debug/obj/local/arm64-v8a/objs/Rhodo//home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/src/main/jni/imageprocessing/dmtxutil.o] Error 1"}
FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':libAndroid:compileDebugNdk'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/opt/android-ndk/ndk-build'' finished with non-zero exit value 2
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: 2.763 secs
对此有什么想法吗?
在 Android Studio 项目的根目录下,有一个名为 "local.properties" 的文件。添加一个名为 "ndk.dir" 的 属性 并将值设置为指向 ndk 的位置。类似于以下内容:
ndk.dir=/Users/username/sdk
我可能没理解你的问题。如果您已经设置了 ndk 的位置并且只是想确保构建了一个模块,那么将模块添加到 "settings.gradle" 文件。
include ":<your module name>"
然后确保将 C 代码放在模块中的 "src/main/jni" 中。 Gradle 会根据文件夹名称自动找到它。不再需要设置 NDK_MODULE_PATH.
使用:
- Gradle版本:3.3
- Android插件版本:com.android.tools.build:gradle:2.3.1
这对我有用:
android {
...
defaultConfig {
...
ndk {
abiFilters 'armeabi', 'armeabi-v7a'
}
externalNativeBuild {
ndkBuild {
// TODO replace jniDependencies folder with the path to your modules
arguments "NDK_MODULE_PATH:=${rootProject.projectDir}/jniDependencies"
}
}
}
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
}
}
这样我就不需要将 NDK_MODULE_PATH 添加到我的 PATH 中来构建项目。然而,clean 任务失败了,因为它不会从这里获取参数,所以我需要添加另一个 hack 来解决这个问题:
tasks.withType(com.android.build.gradle.tasks.ExternalNativeCleanTask) {
it.actions.clear()
doLast {
project.delete("${projectDir}/.externalNativeBuild")
}
}
我正在将 Android 库从 Eclipse 迁移到 Android Studio。在 Eclipse 中,我可以通过 Project > Properties > Resource > Linked Resources > Path Variables 设置 NDK_MODULE_PATH。但是我如何在 Android Studio 中分别使用 gradle 实现同样的事情?
我的库一直在构建,直到它尝试为 NDK_MODULE_PATH 下的模块找到 headers。
错误信息如下:
Executing tasks: [:libAndroid:compileDebugSources, :physicaloidLibrary:compileDebugSources] Configuration on demand is an incubating feature. :libAndroid:preBuild UP-TO-DATE :libAndroid:preDebugBuild UP-TO-DATE :libAndroid:checkDebugManifest :libAndroid:preDebugAndroidTestBuild UP-TO-DATE :libAndroid:preReleaseBuild UP-TO-DATE :physicaloidLibrary:compileLint :physicaloidLibrary:copyReleaseLint UP-TO-DATE :physicaloidLibrary:mergeReleaseProguardFiles UP-TO-DATE :physicaloidLibrary:preBuild UP-TO-DATE :physicaloidLibrary:preReleaseBuild UP-TO-DATE :physicaloidLibrary:checkReleaseManifest :physicaloidLibrary:prepareReleaseDependencies :physicaloidLibrary:compileReleaseAidl UP-TO-DATE :physicaloidLibrary:compileReleaseRenderscript UP-TO-DATE :physicaloidLibrary:generateReleaseBuildConfig UP-TO-DATE :physicaloidLibrary:generateReleaseAssets UP-TO-DATE :physicaloidLibrary:mergeReleaseAssets UP-TO-DATE :physicaloidLibrary:generateReleaseResValues UP-TO-DATE :physicaloidLibrary:generateReleaseResources UP-TO-DATE :physicaloidLibrary:packageReleaseResources UP-TO-DATE :physicaloidLibrary:processReleaseManifest UP-TO-DATE :physicaloidLibrary:processReleaseResources UP-TO-DATE :physicaloidLibrary:generateReleaseSources UP-TO-DATE :physicaloidLibrary:compileReleaseJava UP-TO-DATE :physicaloidLibrary:processReleaseJavaRes UP-TO-DATE :physicaloidLibrary:packageReleaseJar UP-TO-DATE :physicaloidLibrary:compileReleaseNdk UP-TO-DATE :physicaloidLibrary:packageReleaseJniLibs UP-TO-DATE :physicaloidLibrary:packageReleaseLocalJar UP-TO-DATE :physicaloidLibrary:packageReleaseRenderscript UP-TO-DATE :physicaloidLibrary:bundleRelease UP-TO-DATE :libAndroid:prepareLibAndroidGradlePhysicaloidLibraryUnspecifiedLibrary UP-TO-DATE :libAndroid:prepareDebugDependencies :libAndroid:compileDebugAidl UP-TO-DATE :libAndroid:compileDebugRenderscript UP-TO-DATE :libAndroid:generateDebugBuildConfig UP-TO-DATE :libAndroid:generateDebugAssets UP-TO-DATE :libAndroid:mergeDebugAssets UP-TO-DATE :libAndroid:generateDebugResValues UP-TO-DATE :libAndroid:generateDebugResources UP-TO-DATE :libAndroid:mergeDebugResources UP-TO-DATE :libAndroid:processDebugManifest UP-TO-DATE :libAndroid:processDebugResources UP-TO-DATE :libAndroid:generateDebugSources UP-TO-DATE :libAndroid:compileDebugJava UP-TO-DATE :libAndroid:compileDebugNdk AGPBI: {"kind":"SIMPLE","text":"/home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/src/main/jni/imageprocessing/dmtxutil.c:30:18: fatal error: dmtx.h: No such file or directory","position":{},"original":"/home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/src/main/jni/imageprocessing/dmtxutil.c:30:18: fatal error: dmtx.h: No such file or directory"} AGPBI: {"kind":"SIMPLE","text":" #include \u003cdmtx.h\u003e","position":{},"original":" #include \u003cdmtx.h\u003e"} AGPBI: {"kind":"SIMPLE","text":" ^","position":{},"original":" ^"} AGPBI: {"kind":"SIMPLE","text":"compilation terminated.","position":{},"original":"compilation terminated."} AGPBI: {"kind":"SIMPLE","text":"make: *** [/home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/build/intermediates/ndk/debug/obj/local/arm64-v8a/objs/Rhodo//home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/src/main/jni/imageprocessing/dmtxutil.o] Error 1","position":{},"original":"make: *** [/home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/build/intermediates/ndk/debug/obj/local/arm64-v8a/objs/Rhodo//home/rhodo/dev/android/studio/LibAndroidGradle/libAndroid/src/main/jni/imageprocessing/dmtxutil.o] Error 1"} FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':libAndroid:compileDebugNdk'. > com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/opt/android-ndk/ndk-build'' finished with non-zero exit value 2 * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. BUILD FAILED Total time: 2.763 secs
对此有什么想法吗?
在 Android Studio 项目的根目录下,有一个名为 "local.properties" 的文件。添加一个名为 "ndk.dir" 的 属性 并将值设置为指向 ndk 的位置。类似于以下内容:
ndk.dir=/Users/username/sdk
我可能没理解你的问题。如果您已经设置了 ndk 的位置并且只是想确保构建了一个模块,那么将模块添加到 "settings.gradle" 文件。
include ":<your module name>"
然后确保将 C 代码放在模块中的 "src/main/jni" 中。 Gradle 会根据文件夹名称自动找到它。不再需要设置 NDK_MODULE_PATH.
使用:
- Gradle版本:3.3
- Android插件版本:com.android.tools.build:gradle:2.3.1
这对我有用:
android {
...
defaultConfig {
...
ndk {
abiFilters 'armeabi', 'armeabi-v7a'
}
externalNativeBuild {
ndkBuild {
// TODO replace jniDependencies folder with the path to your modules
arguments "NDK_MODULE_PATH:=${rootProject.projectDir}/jniDependencies"
}
}
}
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
}
}
这样我就不需要将 NDK_MODULE_PATH 添加到我的 PATH 中来构建项目。然而,clean 任务失败了,因为它不会从这里获取参数,所以我需要添加另一个 hack 来解决这个问题:
tasks.withType(com.android.build.gradle.tasks.ExternalNativeCleanTask) {
it.actions.clear()
doLast {
project.delete("${projectDir}/.externalNativeBuild")
}
}