2012-07-18 176 views
0

我试图将我的库libtest.so包含到另一个库中。Android.mk:共享库未链接

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就足以使用该库。

我错过了什么?

+0

检查此链接http://stackoverflow.com/questions/10593987/android-ndk-linking/10615769#10615769 – codetiger 2012-07-19 06:30:29

回答

0

添加哪些myinclude.h包含对LOCAL_C_INCLUDES目录:

LOCAL_C_INCLUDES += /dir/to/your/include/files/ 
+0

它是在相同的目录,所以不能它:(我期待一个问题找到libtest .so文件。将LOCAL_C_INCLUDES指向libtest.so文件没有工作 – erinys 2012-07-22 21:50:53

+0

你能列出你的详细项目目录结构吗?或者你可以共享你的项目进行调试,如果可能的话。 – Gavin 2012-07-23 06:07:50

0

因为它是图书馆的责任,告诉你什么,包括,尽管它可能会暂时解决问题使用LOCAL_C_INCLUDES指定包括书面文件由其他人(如the answer by Gavin中所建议的)在可维护性方面不是一个好主意。

其中一个问题是,您的问题是libtestAndroid.mk文件未正确书写。如果它导出任何头文件,则应该为其添加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库。这表明共享库可以包含另一个共享库,没有任何问题。

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