1

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

在使用libtest.soin socket.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.so 中,任何人都可以告诉我如何避免依赖 .a 文件来创建 .so 文件。

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

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

4

2 回答 2

1

好像有点不干净。

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

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

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

编辑:

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

于 2012-07-27T10:58:10.383 回答
0

非常感谢@onitake。

这里有一个简单的错误是 libtest.so 不正确(由有错误的代码创建)。

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

笔记:

如果有人有正确的 .so 文件,但它仍然给出错误,那么可能存在一些链接错误。所以只需删除该行:

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

并放

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

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

于 2012-10-03T12:14:03.013 回答