我正在尝试将我的库libtest.so
包含到另一个库中。
libtest.so
已成功编译并位于文件夹中:
$PROJECT/obj/local/armeabi/libtest.so
当我尝试在Android.mk
文件中使用它时,我无法使用其功能。但是,我没有收到错误消息,即使我包含了一个不存在的库。
这是我的Android.mk
文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#LOCAL_SHARED_LIBRARY := test
LOCAL_SHARED_LIBRARIES := test
LOCAL_MODULE := mylib
LOCAL_SRC_FILES := myLib.cpp
include $(BUILD_SHARED_LIBRARY)
当我构建这个时,我从库中包含了很多"No such file or directory"
个错误:
jni/myLib.cpp:10:24: error: myinclude.h: No such file or directory
myinclude.h
是来自库的文件。每个论坛答案似乎都说LOCAL_SHARED_LIBRARIES := test
或LOCAL_SHARED_LIBRARIES := libtest
足以使用该库。
我错过了什么?
答案 0 :(得分:0)
将包含myinclude.h的目录添加到LOCAL_C_INCLUDES:
LOCAL_C_INCLUDES += /dir/to/your/include/files/
答案 1 :(得分:0)
由于图书馆有责任告诉您要包含哪些内容,尽管它可以暂时解决问题,但使用LOCAL_C_INCLUDES
指定由其他人编写的包含文件(如the answer by Gavin中所述)不是在可维护性方面是一个好主意。
其中一个问题是您的问题是Android.mk
libtest
文件未正确写入。如果它导出任何头文件,您应该向其添加LOCAL_EXPORT_C_INCLUDES := /path/to/include-dir
。
以下是一个示例(取自$NDK_ROOT/samples/module-exports/jni/Android.mk
):
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_CFLAGS := -DFOO=2
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/foo
LOCAL_EXPORT_CFLAGS := -DFOO=1
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar/bar.c
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/bar
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := zoo
LOCAL_SRC_FILES := zoo/zoo.c
LOCAL_SHARED_LIBRARIES := bar
include $(BUILD_SHARED_LIBRARY)
此处,第一个库是foo
。它构建为静态库(请参阅include $(BUILD_STATIC_LIBRARY)
)。它导出头目录:
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/foo
第二个库是bar
,它是一个共享库(请参阅LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/bar
)。当它引用foo
时:
LOCAL_STATIC_LIBRARIES := foo
foo
中的标题将被搜索,就好像已将-I$LOCAL_PATH/foo
指定给gcc
一样。
请注意,它还导出自己的头目录:
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/bar
第三个库是zoo
,它是一个共享库。它引用了bar
库。这表明共享库可以包含另一个共享库而没有任何问题。
如果这不能解决您的问题,请包含更多配置。