Windows、Android NDK 上的 Hello-Jni - build-local.mk:没有这样的文件
Hello-Jni on Windows, Android NDK - build-local.mk: No such file
我曾尝试搜索 Internet 和 Whosebug(文章太多,无法计数)但无法找到包含所有这些内容的帮助:
- 比 2013 年更近
- 开发时不需要 Cygwin
在 Windows
- 适用于 Android Studio,而非 Eclipse。
我第一次进入 Android 开发,我新加入的项目依赖于使用 NDK 进行开发。我一直在阅读 NDK 附带的文档,但是 运行 与此示例一起进入石墙。
我正在尝试构建 hello-jni
,NDK 中的示例项目。这是我的环境:
- Android Studio 1.4(最新,目前可用的稳定版本)
- NDK 版本:r10e
- OS: Windows 7
Application.mk 文件的内容:
APP_ABI := all64 // Came with 'all', read somewhere on SO that it
// should be 'all64'. Result is the same.
Android.mk 文件的内容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
我的 PATH 环境变量包括一个到我的 NDK 根文件夹和 \prebuilt\windows-x86_64\bin
的路径(因为我阅读了其中一篇应该有的文章。)不过,当我导航到 hello-jni 根文件夹时,并调用 ndk-build,我只看到错误。
c:\NDK\android-ndk-r10e\build\core\build-local.mk:40: c:/NDK/android-ndk-r10e/build/core/build/core/init.mk: No such file or directory
c:\NDK\android-ndk-r10e\build\core\build-local.mk:191: \add-application.mk: No such file or directory
c:\NDK\android-ndk-r10e\build\core\build-local.mk:206: \setup-imports.mk: No such file or directory
c:\NDK\android-ndk-r10e\build\core\build-local.mk:223: \build-all.mk: No such file or directory
make.exe: *** No rule to make target `\build-all.mk'. Stop.
如果需要其他人帮助我,请说我会尽力而为。非常感谢所有帮助。
编辑:
我在 Windows 上看到的大多数文章都提到了 Cygwin,但根据文档,不需要它。如果这不正确,请纠正我?
\android-ndk-r10e\docs\Programmers_Guide\html\md_3__key__topics__building__s_t_a_n_d_a_l_o_n_e-_t_o_o_l_c_h_a_i_n.html
除外
Windows support
The Windows binaries do not depend on Cygwin. The good news is that they are thus faster, the bad news is that they do not understand the Cygwin path specification like /cygdrive/c/foo/bar (instead of C:/foo/bar).
The NDK build system ensures that all paths passed to the compiler from Cygwin are automatically translated, and deals with other horrors for you. If you have a custom build system, you may need to deal with the problem yourself.
我不能把这个答案归功于我,一位同事好心地帮我查了一下。当他找到答案时,我要求知道他还做了什么,因为显然我一定错过了一些魔法?我只看到他在一个 make 文件中切换了两行,必须有更多吗? las,不。仅此一项就是我痛苦的根源。
虽然我不太愿意将它称为 NDK 中的错误,因为我不知道它如何与 Cygwin 一起工作,但我们都无法理解它是如何 曾经 工作的对于使用原生 Windows 构建的任何人,因为我将引用的行记录在 git 存储库中,作为在 2011 年或 2010 年添加回来的。( https://android.googlesource.com/platform/ndk/+/master/build/core/build-local.mk )
为了帮助解释,这里是我错误的第一行:
c:\NDK\android-ndk-r10e\build\core\build-local.mk:40: c:/NDK/android-ndk-r10e/build/core/build/core/init.mk: No such file or directory
第一个找不到的文件是...build/core/build/core/init.mk
,当然不存在,因为build/core
不应该重复。
开始构建的命令 ndk-build.cmd
调用 build\core\build-local.mk
开始该过程。在此文件中,环境变量 NDK_ROOT 在进入时 重新创建 。无论 my NDK_ROOT 是什么,都是无关紧要的。
NDK_ROOT := $(dir $(lastword $(MAKEFILE_LIST)))
NDK_ROOT := $(strip $(NDK_ROOT:%build/core/=%))
NDK_ROOT := $(subst \,/,$(NDK_ROOT))
NDK_ROOT := $(NDK_ROOT:%/=%)
.
.
.
第二行从我的新NDK_ROOT的末尾去掉当前目录(build/core/
)的末尾,因为真正的根目录应该是build
的父目录并且因为稍后将添加回来以查找所有这些 'missing' 文件。没关系,但请注意搜索中使用的正斜杠 (/
)。 Windows 不使用(或者至少根据我的经验,通常不使用 return)正斜杠,但如果给出正斜杠,它通常会解析它们。 (例如,当更改目录时,我发现只要我已经知道我需要去哪里,两者都是可以接受的。如果我的路径以 /
结尾,Tab 补全似乎不起作用。)
哦,但是请看第三行(2011 年添加的)! NDK_ROOT 中的每个反斜杠 (\
) 都被替换为正斜杠 (/
)。所以 build/core/
的替换应该会顺利进行,对吧?问题:为时已晚。
strip 调用已经发生,如果 NDK_ROOT 收到一个带有反斜杠而不是正斜杠的路径,则 build/core/
永远不会被发现并从变量中删除。我的同事是如何修复它的?简单。他换了台词:
NDK_ROOT := $(dir $(lastword $(MAKEFILE_LIST)))
NDK_ROOT := $(subst \,/,$(NDK_ROOT))
NDK_ROOT := $(strip $(NDK_ROOT:%build/core/=%))
NDK_ROOT := $(NDK_ROOT:%/=%)
我的 hello-jni
项目现在与 Teapot
一起构建,另一个来自 NDK 的示例,我尝试确定它。 native-audio
、native-codec
、native-media
和 More Teapots
也是如此。还没有尝试 运行 它们......但我没有构建错误。
我不知道此修复程序是否会破坏 Cygwin 用户,我的盒子上没有。我也不知道它是否会破坏 Linux 环境,因为我的盒子上没有 Linux。但这可能会对本地 Windows 用户有所帮助,我希望如此,因为我花了 3 或 4 天的时间在这方面徒劳地苦苦思索,一次阅读的 SO 文章比我曾经关心的还要多。
使用 windows 机器我遇到了这个错误,但它说的是 clear-vars.mk : No such file or directory。在我查看了目录
中的ndk-build.cmd之后
C:\Users\AppData\Local\Android\Sdk\ndk-bundle\build
文件看起来像这样
@echo off
set NDK_ROOT=%~dp0\..
set PREBUILT_PATH=%NDK_ROOT%\prebuilt\windows-x86_64
if exist %PREBUILT_PATH% goto FOUND
set PREBUILT_PATH=%NDK_ROOT%\prebuilt\windows
:FOUND
"%PREBUILT_PATH%\bin\make.exe" -f "%NDK_ROOT%\build\core\build-local.mk" SHELL=cmd %*
但是你也会在目录
下找到相同的文件名
C:\Users\jmatthews\AppData\Local\Android\Sdk\ndk-bundle
文件看起来像这样
@echo off
%~dp0\build\ndk-build.cmd %*
删除第二行,使其看起来像这样,只有 1 行回显关闭
@echo off
此文件被调用并打乱了 Windows 目录结构。之后我就可以在 windows 上编译了。此外,我在目录中使用 space 时遇到项目问题,因此请将项目位置移动到没有 spaces.
的目录
我曾尝试搜索 Internet 和 Whosebug(文章太多,无法计数)但无法找到包含所有这些内容的帮助:
- 比 2013 年更近
- 开发时不需要 Cygwin 在 Windows
- 适用于 Android Studio,而非 Eclipse。
我第一次进入 Android 开发,我新加入的项目依赖于使用 NDK 进行开发。我一直在阅读 NDK 附带的文档,但是 运行 与此示例一起进入石墙。
我正在尝试构建 hello-jni
,NDK 中的示例项目。这是我的环境:
- Android Studio 1.4(最新,目前可用的稳定版本)
- NDK 版本:r10e
- OS: Windows 7
Application.mk 文件的内容:
APP_ABI := all64 // Came with 'all', read somewhere on SO that it
// should be 'all64'. Result is the same.
Android.mk 文件的内容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
我的 PATH 环境变量包括一个到我的 NDK 根文件夹和 \prebuilt\windows-x86_64\bin
的路径(因为我阅读了其中一篇应该有的文章。)不过,当我导航到 hello-jni 根文件夹时,并调用 ndk-build,我只看到错误。
c:\NDK\android-ndk-r10e\build\core\build-local.mk:40: c:/NDK/android-ndk-r10e/build/core/build/core/init.mk: No such file or directory
c:\NDK\android-ndk-r10e\build\core\build-local.mk:191: \add-application.mk: No such file or directory
c:\NDK\android-ndk-r10e\build\core\build-local.mk:206: \setup-imports.mk: No such file or directory
c:\NDK\android-ndk-r10e\build\core\build-local.mk:223: \build-all.mk: No such file or directory
make.exe: *** No rule to make target `\build-all.mk'. Stop.
如果需要其他人帮助我,请说我会尽力而为。非常感谢所有帮助。
编辑: 我在 Windows 上看到的大多数文章都提到了 Cygwin,但根据文档,不需要它。如果这不正确,请纠正我?
\android-ndk-r10e\docs\Programmers_Guide\html\md_3__key__topics__building__s_t_a_n_d_a_l_o_n_e-_t_o_o_l_c_h_a_i_n.html
Windows support
The Windows binaries do not depend on Cygwin. The good news is that they are thus faster, the bad news is that they do not understand the Cygwin path specification like /cygdrive/c/foo/bar (instead of C:/foo/bar).
The NDK build system ensures that all paths passed to the compiler from Cygwin are automatically translated, and deals with other horrors for you. If you have a custom build system, you may need to deal with the problem yourself.
我不能把这个答案归功于我,一位同事好心地帮我查了一下。当他找到答案时,我要求知道他还做了什么,因为显然我一定错过了一些魔法?我只看到他在一个 make 文件中切换了两行,必须有更多吗? las,不。仅此一项就是我痛苦的根源。
虽然我不太愿意将它称为 NDK 中的错误,因为我不知道它如何与 Cygwin 一起工作,但我们都无法理解它是如何 曾经 工作的对于使用原生 Windows 构建的任何人,因为我将引用的行记录在 git 存储库中,作为在 2011 年或 2010 年添加回来的。( https://android.googlesource.com/platform/ndk/+/master/build/core/build-local.mk )
为了帮助解释,这里是我错误的第一行:
c:\NDK\android-ndk-r10e\build\core\build-local.mk:40: c:/NDK/android-ndk-r10e/build/core/build/core/init.mk: No such file or directory
第一个找不到的文件是...build/core/build/core/init.mk
,当然不存在,因为build/core
不应该重复。
开始构建的命令 ndk-build.cmd
调用 build\core\build-local.mk
开始该过程。在此文件中,环境变量 NDK_ROOT 在进入时 重新创建 。无论 my NDK_ROOT 是什么,都是无关紧要的。
NDK_ROOT := $(dir $(lastword $(MAKEFILE_LIST)))
NDK_ROOT := $(strip $(NDK_ROOT:%build/core/=%))
NDK_ROOT := $(subst \,/,$(NDK_ROOT))
NDK_ROOT := $(NDK_ROOT:%/=%)
.
.
.
第二行从我的新NDK_ROOT的末尾去掉当前目录(build/core/
)的末尾,因为真正的根目录应该是build
的父目录并且因为稍后将添加回来以查找所有这些 'missing' 文件。没关系,但请注意搜索中使用的正斜杠 (/
)。 Windows 不使用(或者至少根据我的经验,通常不使用 return)正斜杠,但如果给出正斜杠,它通常会解析它们。 (例如,当更改目录时,我发现只要我已经知道我需要去哪里,两者都是可以接受的。如果我的路径以 /
结尾,Tab 补全似乎不起作用。)
哦,但是请看第三行(2011 年添加的)! NDK_ROOT 中的每个反斜杠 (\
) 都被替换为正斜杠 (/
)。所以 build/core/
的替换应该会顺利进行,对吧?问题:为时已晚。
strip 调用已经发生,如果 NDK_ROOT 收到一个带有反斜杠而不是正斜杠的路径,则 build/core/
永远不会被发现并从变量中删除。我的同事是如何修复它的?简单。他换了台词:
NDK_ROOT := $(dir $(lastword $(MAKEFILE_LIST)))
NDK_ROOT := $(subst \,/,$(NDK_ROOT))
NDK_ROOT := $(strip $(NDK_ROOT:%build/core/=%))
NDK_ROOT := $(NDK_ROOT:%/=%)
我的 hello-jni
项目现在与 Teapot
一起构建,另一个来自 NDK 的示例,我尝试确定它。 native-audio
、native-codec
、native-media
和 More Teapots
也是如此。还没有尝试 运行 它们......但我没有构建错误。
我不知道此修复程序是否会破坏 Cygwin 用户,我的盒子上没有。我也不知道它是否会破坏 Linux 环境,因为我的盒子上没有 Linux。但这可能会对本地 Windows 用户有所帮助,我希望如此,因为我花了 3 或 4 天的时间在这方面徒劳地苦苦思索,一次阅读的 SO 文章比我曾经关心的还要多。
使用 windows 机器我遇到了这个错误,但它说的是 clear-vars.mk : No such file or directory。在我查看了目录
中的ndk-build.cmd之后C:\Users\AppData\Local\Android\Sdk\ndk-bundle\build
文件看起来像这样
@echo off
set NDK_ROOT=%~dp0\..
set PREBUILT_PATH=%NDK_ROOT%\prebuilt\windows-x86_64
if exist %PREBUILT_PATH% goto FOUND
set PREBUILT_PATH=%NDK_ROOT%\prebuilt\windows
:FOUND
"%PREBUILT_PATH%\bin\make.exe" -f "%NDK_ROOT%\build\core\build-local.mk" SHELL=cmd %*
但是你也会在目录
下找到相同的文件名C:\Users\jmatthews\AppData\Local\Android\Sdk\ndk-bundle
文件看起来像这样
@echo off
%~dp0\build\ndk-build.cmd %*
删除第二行,使其看起来像这样,只有 1 行回显关闭
@echo off
此文件被调用并打乱了 Windows 目录结构。之后我就可以在 windows 上编译了。此外,我在目录中使用 space 时遇到项目问题,因此请将项目位置移动到没有 spaces.
的目录