- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我曾尝试搜索 Internet 和 StackOverflow(文章太多,无法计数)但无法找到包含所有这些内容的帮助:
我是第一次涉足 Android 开发,我新加入的项目依赖于使用 NDK 进行开发。我一直在阅读 NDK 附带的文档,但遇到了这个示例的障碍。
我正在尝试构建 hello-jni
,这是 NDK 中的示例项目。这是我的环境:
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-audio
、native-codec
、native-media
和 More 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.mk & Application.mk的使用有点模糊 我已尝试阅读 documentation that comes with NDK 中的 APPLICATION-MK.HTML
我需要在 Application.mk 文件中指定库的路径才能正确链接它。这个怎么做?有任何 GCC 命令吗? 最佳答案 您必须将 LOCAL_LDLIBS := -L/path/to/the/lib
在 The Little Schemer book ,在第 9 章中,在为任意长输入构建 length 函数时,建议执行以下操作(在 pages 170-171 上),即以下代码片段(来自 page
我使用 jni 创建了一个 Android 项目。现在我想使用预处理器宏来区分精简版和完整版。它应该看起来像这样: #ifdef LITE auto label = LabelTTF::cre
看起来有可能,但我的脚本产生了奇怪的结果: LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) include $(LOCAL_PATH)/libos/
我正在深入研究在我的项目中使用android tesseract api。 https://github.com/rmtheis/tess-two 我将 com_googlecode_leptonic
在 Android 应用程序中,我想将一个 android.mk 文件导入应用程序中的另一个 Android.mk 文件 为此,我在一个 Andorid.mk 文件中使用了该文件,该文件将被导入到同一
这是代码 -(id) initWithNibName:(NSString*) nibNameOrNil bundle:(NSBundle*)nibBundleOrNil { ... [se
我已经下载了 OpenCV for Android 版本 3.2 并将其 java 模块导入到我的项目中。我已将 native (c++) 代码复制到 openCVLibrary320/app/src
我从来没有用 Android 构建过 curl。 先决条件:我正在使用 Android Studio 2.1.2我正在使用 NDK ,非实验性方式我在 curlLib 目录的 jni 文件夹中有 cu
我有一个顶级 defines.mk 文件,它列出了某些目录和 C 库,根据项目的不同而包含。 KERNEL_LIB = -lkdev DRIVER_LIB = -ldriver -lutil -li
Android.mk简介: Android.mk文件用来告知NDK Build 系统关于Source的信息。 Android.mk将是GNU Makefile的一部分,且将被Build
我觉得 CMake 和 Android.mk 有很多共同点,有人可以向我解释一下有什么区别,为什么谷歌发明了一个新的构建系统而不使用 CMake? 最佳答案 Android 开发人员有更多的变化。现在
我正在努力获取一个模块以在 Android 上编译。它引用了一个已经存在的共享库——我只有 .so 和 .h 文件。 我当前的 Android.mk 如下所示: LOCAL_PATH:= $(call
嗨,我是 android 应用程序的新手,你能告诉我如何创建 jni 和 android.mk ....我知道 jni 的目的但是如何在我的项目中创建那个 jni 告诉我一步一步 最佳答案 嗨NDK
在Android.mk中有什么方法可以使用条件表达式吗?我需要它来做这样的事: IF arch = AREABI_V7 *use path for my arm_v7 static libs*
在我的新项目中,我需要基于一个c写的项目。而且我知道我可以使用 NDK 来完成它,但这里有一个问题:如何将标准的 Makefile 重写到 Android.mk 中?再者,在Android中,是否可以
我正在使用 Android NDK 构建我的 cocos2dx 项目,在 Android.mk 中,有一个 LOCAL_SRC_FILES 的定义,其中列出了每个 cpp 文件。每当我添加一个新的源文
我正在尝试使用 android ndk(在 Windows 上)构建一个项目,但我遇到了一些问题,特别是源文件(Android.mk 中的 LOCAL_SRC_FILES) 我正在尝试使用父文件夹的相
LOCAL_PATH := $(call my-dir) TOP_LOCAL_PATH := $(call my-dir)/../ #Add target arm version ifeq ($(TA
我是一名优秀的程序员,十分优秀!