$(LOCAL_PATH) 没有正确返回当前目录的路径

$(LOCAL_PATH) not returning the path to current directory correctly

我正在使用 Android NDK 编译共享库。我正在使用最新版本的 Android Studio (Android Studio 15- #AI-141.2422023 )。在我的 cpp 代码中,我使用的是第三方共享库。在编写Android.mk文件时,我先创建了一个PREBUILT_SHARED_LIBRARY,代码如下。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := essentia
LOCAL_SRC_FILES := $(LOCAL_PATH)/../../../essentia-shared/lib/libessentia.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../../essentia-shared/include/essentia

include $(PREBUILT_SHARED_LIBRARY)

我面临的问题是 $(LOCAL_PATH) 的行为有点奇怪。 returning 的路径是

 jni/jni/../../../essentia-shared/lib/libessentia.so

我有以下问题:

  1. 我不太清楚,为什么在路径前面附加了两个jni's。此外,当我尝试使用 $(warning $(LOCAL_PATH)) 打印 LOCAL_PATH 的值时,它会打印 jni.
  2. $(LOCAL_PATH) return 不应该是绝对路径吗?这更令人困惑,因为有时我使用 $(LOCAL_PATH).
  3. 获得绝对路径

PS:我正在使用 Android Studio 内部的终端到 运行 ndk-build

编辑 1: 我 运行 来自 src/main

ndk-build

$(call my-dir) 来自 src/main for src/main/jni/Android.mk 结果是 "jni"。另一方面,LOCAL_SRC_FILES 总是相对于 LOCAL_PATH 进行处理,即 "jni"。这就是 jni/jni 对您的 .so.

的显示方式

另一方面,所有 …_INCLUDES 都相对于工作目录进行处理,在您的情况下是从您启动 ndk-build 的地方 src/main .由于当前目录的微妙性质,最好对所有包含路径使用绝对路径。

因此,这是建议重写您的 Android.mk:

的这一部分
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := app-lib
LOCAL_SRC_FILES := a.cpp b.cpp
LOCAL_SHARED_LIBRARIES := essentia
include $(BUILD_SHARED_LIBRARY)

LOCAL_PATH += /../../../essentia-shared
include $(CLEAR_VARS)
LOCAL_MODULE := essentia
LOCAL_SRC_FILES := lib/libessentia.so
LOCAL_EXPORT_C_INCLUDES := $(abspath $(LOCAL_PATH)/include/essentia)
include $(PREBUILT_SHARED_LIBRARY)