避免使用.a来创建.so

时间:2012-07-27 10:45:24

标签: makefile android-ndk java-native-interface

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

在socket.so中使用libtest.so时,我得到了error:undefined reference to function()。我的function()出现在libtest.so内。所以通过建议我已经创建了我的Android.mk,如下所示:

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文件存在。好像我只使用libtest.a,它完全正常。

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

如果我发表评论LOCAL_LDFLAGS += libtest.a,那么我将收到error:undefined reference to function()

任何人都帮助我摆脱这个问题.......

2 个答案:

答案 0 :(得分:1)

似乎有点不干净。

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

您是否还可以发布ndk-build正在执行的命令的控制台转储?

您可能也会尝试避免您正在做的事情,因为NDK实际上不是要生成相互依赖的共享库。当然可能,但推荐的方法是将libs填充到静态存档中,并将它们直接链接到生成的JNI .so。

修改

LOCAL_SRC_FILES := libtest.so似乎错了。如果您想链接与共享库,请将库传递给链接器而不是编译器:LOCAL_LDFLAGS += libtest.so或者更好,LOCAL_LDFLAGS += -L. -ltest

答案 1 :(得分: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 

以上两个陈述都是相同的,但有时候是有效的。