Android.mk:未链接的共享库

时间:2012-07-18 03:12:36

标签: linker makefile android-ndk

我正在尝试将我的库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 := testLOCAL_SHARED_LIBRARIES := libtest足以使用该库。

我错过了什么?

2 个答案:

答案 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库。这表明共享库可以包含另一个共享库而没有任何问题。

如果这不能解决您的问题,请包含更多配置。