我曾尝试搜索互联网和StackOverflow(计算的文章太多),但无法找到所有这些内容的帮助:
我第一次潜入Android开发项目,我新加入的项目取决于使用NDK进行开发。我一直在阅读NDK附带的文档,但是这个样本已经碰到了一堵石墙。
我正在尝试构建NDK中的示例项目hello-jni
。这是我的环境:
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支持
Windows二进制文件不依赖于Cygwin。好消息是它们因此更快,坏消息是它们不理解Cygwin路径规范,如/ cygdrive / c / foo / bar(而不是C:/ foo / bar)。
NDK构建系统确保从Cygwin传递给编译器的所有路径都会自动转换,并为您处理其他恐怖事件。如果您有自定义构建系统,则可能需要自己处理问题。
答案 0 :(得分:2)
我不能因为这个答案而受到赞誉,一位同事为我慷慨解囊。当他找到答案时,我要求知道他还做了什么,因为显然我一定错过了一些魔法?我只看到他在一个make文件中切换两行,还有更多?唉,没有。仅这一点就是我的祸患的来源。
虽然我不愿意在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在输入时重新创建。无论我的 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
的父目录,因为它将被添加稍后回来查找所有那些“丢失”的文件。这很好,除了注意搜索中使用的正斜杠(/
)。 Windows不使用(或者至少在我的经验中,通常不会返回)正斜杠,但如果它是给出的,它通常会解析它们。 (例如,在更改目录时,我发现只要我已经知道我需要去哪里就可以接受。如果我的路径以/
结尾,则Tab完成似乎不起作用。)
哦,但看看第三行(2011年又回来了)!在NDK_ROOT中替换为每个反斜杠(\
),替换为正斜杠(/
)。所以build/core/
的替换应该顺利进行,对吧?问题:现在为时已晚。
条带调用已经发生,如果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文章。
答案 1 :(得分:0)
在Windows机器上,我遇到此错误,但它说的是clear-vars.mk:没有这样的文件或目录。在查看目录中的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 %*
删除第二行,使它看起来像这样,只关闭了第一行
@echo off
此文件被调用,并弄乱了Windows目录结构。之后,我可以在Windows上进行编译。另外,我在目录中使用空格对项目有问题,因此将您的项目位置移动到没有空格的目录中。