gpt4 book ai didi

android - Windows 上的 Hello-Jni,Android NDK - build-local.mk : No such file

转载 作者:可可西里 更新时间:2023-11-01 11:49:34 26 4
gpt4 key购买 nike

我曾尝试搜索 Internet 和 StackOverflow(文章太多,无法计数)但无法找到包含所有这些内容的帮助:

  1. 比 2013 年更近
  2. 开发时不需要 Cygwin在 Windows 上
  3. 适用于 Android Studio,而非 Eclipse。

我是第一次涉足 Android 开发,我新加入的项目依赖于使用 NDK 进行开发。我一直在阅读 NDK 附带的文档,但遇到了这个示例的障碍。

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

  • 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 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: 没有那个文件或目录

第一个找不到的文件是...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< 的父目录 并且因为稍后将添加回来以查找所有那些“丢失”的文件。没关系,但请注意搜索中使用的正斜杠 (/)。 Windows 不使用(或者至少根据我的经验,通常不返回)正斜杠,但如果给出正斜杠,它通常会解析它们。 (例如,当更改目录时,我发现只要我已经知道我需要去哪里,两者都是可以接受的。如果我的路径以 / 结尾,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-audionative-codecnative-mediaMore Teapots 也是如此。还没有尝试运行它们......但我没有构建错误。

我不知道这个修复是否会破坏 Cygwin 用户,我的盒子上没有。我也不知道它是否会破坏 Linux 环境,因为我的盒子上没有 Linux。但这可能对 native Windows 用户有所帮助,我希望如此,因为我花了 3 或 4 天的时间在这个问题上徒劳地苦苦思索,一次阅读的 SO 文章比我曾经关心的还要多。

关于android - Windows 上的 Hello-Jni,Android NDK - build-local.mk : No such file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33291906/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com