2012-07-27 54 views
1

我已经创建了一个android应用程序,这里大部分代码都在c中,所以我使用jni创建了它。我必须创建socket.so文件,其中我必须使用libtest.so避免使用.a创建.so

同时在socket.so中使用libtest.so所以我得到了error:undefined reference to function()。我的函数()存在于libtest.so内。

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := libtest 
LOCAL_SRC_FILES := libtest.so 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := socket 
LOCAL_SHARED_LIBRARIES += libtest 
LOCAL_SRC_FILES := source/interface.c source/file.c 
LOCAL_LDFLAGS += libtest.a 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../libtest/jni/include 
include $(BUILD_SHARED_LIBRARY) 

,但它同时需要libtest.so & libtest.a文件存在:通过这么建议,我已经建立了我Android.mk如下使用Avid这一点。如果我只使用libtest.a就好了。

因为我的要求是创建libtest.so并将其包含在socket.so中,任何人都可以告诉我如何避免依赖.a文件来创建.so文件。

如果我会评论LOCAL_LDFLAGS += libtest.a然后我得到了error:undefined reference to function()

任何一个plz帮助我走出这个问题.......

回答

1

似乎有点不干净。

共享库(.so)和档案(.a)都应该包含相同的代码,但实际上它们可能不会。你应该做的第一件事是检查.so是否真的有所有的符号。链接器可能已经优化了一些。为此,请使用nm实用程序或objdump

你也可以发布命令ndk-build正在执行的控制台转储?

你也可能试着避免你正在做的事情,因为NDK并不是真的意味着要产生相互依赖的共享库。这当然是可能的,但推荐的方法是将你的库放入静态归档并将它们直接链接到生成的JNI .so中。

编辑:

LOCAL_SRC_FILES := libtest.so似乎是错误的。如果你想链接与共享库,该库传给连接器不是编译器:LOCAL_LDFLAGS += libtest.so,或者甚至更好,LOCAL_LDFLAGS += -L. -ltest

+0

while nm -a libxml2.so我没有得到任何符号。 但是当我完成nm -a libxml2.a时,我得到了它们...... .. – 2012-07-27 11:22:44

+0

使用'nm -D'作为共享库,否则您将看不到任何东西。不要使用'-a'作为静态库,它将打印调试符号而不是普通的符号。 – onitake 2012-07-27 11:32:05

+0

是通过使用-D我能够得到东西 – 2012-07-27 11:53:24

0

非常感谢给@onitake。

这里存在一个简单的错误,那就是libtest.so不合适(由具有错误的代码创建)。

然后当我创建了一个合适的libtest.so,

注:

如果有一个人是有正确的.so文件,仍然提示错误则可能是一些链接错误。所以JST删除行:

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../libtest/jni/include 

,并把

LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/../../libtest/jni/include 

两个以上陈述的是相同的,但有些时候,它的工作。