$(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
我有以下问题:
- 我不太清楚,为什么在路径前面附加了两个
jni's
。此外,当我尝试使用 $(warning $(LOCAL_PATH))
打印 LOCAL_PATH
的值时,它会打印 jni
.
-
$(LOCAL_PATH)
return 不应该是绝对路径吗?这更令人困惑,因为有时我使用 $(LOCAL_PATH)
. 获得绝对路径
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)
我正在使用 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
我有以下问题:
- 我不太清楚,为什么在路径前面附加了两个
jni's
。此外,当我尝试使用$(warning $(LOCAL_PATH))
打印LOCAL_PATH
的值时,它会打印jni
. -
$(LOCAL_PATH)
return 不应该是绝对路径吗?这更令人困惑,因为有时我使用$(LOCAL_PATH)
. 获得绝对路径
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)