我正在使用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命令识别这些包含位置的正确方法是什么。任何帮助都会得到很大的帮助。
更新:
我想补充一点,对于Java层来说,spaceite本身是不可见的。之后我将构建另一个使用spatialite的模块。我不确定这是否会对我在Android.mk文件中声明模块的方式产生影响。
编译器输出如下所示: jni / spatialite.c:102:20:致命错误:geos_c.h:没有这样的文件或目录 #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返回两级而不是三级。
答案 0 :(得分: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
文件:./ project / externalappsdk / include / geos_c.h
//empty file
至少应该将LOCAL_PATH行添加到Android.mk
如果这不能解决问题,那么请更新您的问题,看看您的项目结构与我的重新创建之间的差异。
答案 1 :(得分:0)
使用LOCAL_EXPORT_C_INCLUDE_DIRS代替LOCAL_C_INCLUDES