草庐IT

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

coder 2024-06-21 原文

我曾尝试搜索 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/

有关android - Windows 上的 Hello-Jni,Android NDK - build-local.mk : No such file的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  3. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

  4. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  5. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  6. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  7. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  8. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

  9. ruby - 如何在 Ruby 中执行 Windows CLI 命令? - 2

    我在目录“C:\DocumentsandSettings\test.exe”中有一个文件,但是当我用单引号编写命令时`C:\DocumentsandSettings\test.exe(我无法在此框中显示),用于在Ruby中执行命令,我无法这样做,我收到的错误是找不到文件或目录。我尝试用“//”和“\”替换“\”,但似乎没有任何效果。我也使用过系统、IO.popen和exec命令,但所有的努力都是徒劳的。exec命令还使程序退出,这是我不想发生的。提前致谢。 最佳答案 反引号环境就像双引号,所以反斜杠用于转义。此外,Ruby会将空格解

  10. ruby-on-rails - gem install rmagick -v 2.13.1 错误 Failed to build gem native extension on Mac OS 10.9.1 - 2

    我已经通过提供MagickWand.h的路径尝试了一切,我安装了命令工具。谁能帮帮我?$geminstallrmagick-v2.13.1Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingrmagick:ERROR:Failedtobuildgemnativeextension./Users/ghazanfarali/.rvm/rubies/ruby-1.8.7-p357/bin/rubyextconf.rbcheckingforRubyversion>=1.8.5...yescheckingfor/

随机推荐