我创建了一个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()
任何人都帮助我摆脱这个问题.......
答案 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
以上两个陈述都是相同的,但有时候是有效的。