Windows上的Hello-Jni,Android NDK - build-local.mk:没有这样的文件

时间:2015-10-22 22:35:27

标签: android windows android-ndk ndk-build

我曾尝试搜索互联网和StackOverflow(计算的文章太多),但无法找到所有这些内容的帮助:

  1. 比2013年更新
  2. 开发时不需要Cygwin 在Windows上
  3. 面向Android Studio,而不是Eclipse。
  4. 我第一次潜入Android开发项目,我新加入的项目取决于使用NDK进行开发。我一直在阅读NDK附带的文档,但是这个样本已经碰到了一堵石墙。

    我正在尝试构建NDK中的示例项目hello-jni。这是我的环境:

    • Android Studio 1.4(最新版,目前可用的稳定版)
    • NDK版本:r10e
    • 操作系统: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支持

         

    Windows二进制文件不依赖于Cygwin。好消息是它们因此更快,坏消息是它们不理解Cygwin路径规范,如/ cygdrive / c / foo / bar(而不是C:/ foo / bar)。

         

    NDK构建系统确保从Cygwin传递给编译器的所有路径都会自动转换,并为您处理其他恐怖事件。如果您有自定义构建系统,则可能需要自己处理问题。

2 个答案:

答案 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-audionative-codecnative-mediaMore 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上进行编译。另外,我在目录中使用空格对项目有问题,因此将您的项目位置移动到没有空格的目录中。