2

我正在使用 Android NDK 构建共享库。我从我的 Android.mk 文件中包含了一个片段,这给我带来了一些问题。

LOCAL_PATH := $(call my-dir)

..#other module here
..#other module here

include $(CLEAR_VARS)
LOCAL_MODULE    := spatialite
LOCAL_C_INCLUDES := ../../../projects/externalappsdk/include
LOCAL_SRC_FILES := sqlite3.c \
spatialite.c
include $(BUILD_SHARED_LIBRARY)

我的 spatialite.c 文件包含一些位于应用程序项目文件夹外部文件夹中的头文件。如上所示,我已将该文件夹包含在 LOCAL_C_INCLUDES 中,但是在运行 ndk-build 时,它仍然无法找到这些包含。允许 ndk-build 命令识别这些包含的位置的正确方法是什么。任何帮助将不胜感激。

更新:

我想补充一点,spatialite 本身不需要对 Java 层可见。此后,我将构建另一个使用 spatialite 的模块。我不确定这是否会影响我在 Android.mk 文件中声明模块的方式。

编译器输出如下所示: jni/spatialite.c:102:20: fatal error: geos_c.h: No such file or directory #include

在 spatialite.c 中导入的 .h 文件位于 C:/projects/externalappsdk/include。spatialite.c 和 Android.mk 位于 C:/mobile/myandroidproject/jni/

我的 spatialite.c 文件中的 include 指令如下所示:

#ifndef OMIT_GEOS   /* including GEOS */
#include <geos_c.h>
#endif

答案:我设法在克里斯提供的答案的帮助下完成了这项工作,我已经接受了这些答案。但是,我必须对 Android.mk 文件进行一项更改,如下所示:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := spatialite
LOCAL_C_INCLUDES := ../../projects/externalappsdk/include
LOCAL_SRC_FILES := sqlite3.c \
spatialite.c
include $(BUILD_SHARED_LIBRARY)

请注意,LOCAL_C_INCLUDES 向后两级而不是三级。

4

2 回答 2

1

没有

LOCAL_PATH := $(call my-dir)

在 Android.mk 的顶部,我无法按照描述构建您的项目的副本,但是错误与您的报告不同 - 如果没有该指令,编译器将在 NDK 系统目录中搜索 C 源文件,而不是在jni/ 文件夹。

$ cd mobile/myandroidproject/jni
$ ndk-build
Compile thumb  : spatialite <= spatialite.c
SharedLibrary  : libspatialite.so
Install        : libspatialite.so => libs/armeabi/libspatialite.so

文件:./mobile/myandroidproject/jni/Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := spatialite
LOCAL_C_INCLUDES := ../../../projects/externalappsdk/include
LOCAL_SRC_FILES := sqlite3.c \
spatialite.c
include $(BUILD_SHARED_LIBRARY)

文件:./mobile/myandroidproject/jni/spatialite.c

#include <geos_c.h>

文件:./mobile/myandroidproject/jni/sqlite3.c

//empty file

文件:./projects/externalappsdk/include/geos_c.h

//empty file

至少您应该将 LOCAL_PATH 行添加到您的 Android.mk

如果这不能解决问题,那么请用您的项目结构与我的重新创建它之间的任何差异来更新您的问题。

于 2014-03-18T17:24:44.373 回答
0

使用 LOCAL_EXPORT_C_INCLUDE_DIRS 而不是 LOCAL_C_INCLUDES

于 2017-08-09T05:54:56.087 回答