Android NDK - 链接外部库时出现问题(找不到它)

5

我正在使用Cygwin下的Android NDK r6b(系统已正确更新)。我正在修改hello-jni示例,以学习如何使用NDK。由于我有一个用C++编写的库希望在hello-jni中使用(实际上,我创建了一个名为helloworld的项目,其中包含一个名为ndkfoo.cpp的单个.cpp文件),因此我在Eclipse中创建了一个新的Android项目(针对Android进行了更新),添加了一个jni目录,添加了Android.mk和Application.mk文件,并编辑它们以编译.cpp文件。在编译结束时,我得到一个.so文件。

现在,在helloworld Android.mk中,我需要做一些编辑,以便告诉链接器包括该库。假设库文件是libmylib.so,则我有以下android.mk脚本:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := ndkfoo

LOCAL_SRC_FILES := ndkfoo.cpp

LOCAL_C_INCLUDES += $(LOCAL_PATH)/mylib

LOCAL_LDLIBS += -L$(LOCAL_PATH)/../../mylib/libs/armeabi/ -lmylib

include $(BUILD_SHARED_LIBRARY)

我的目录组织方式如下:

d:/android/android-ndk-r6b => android ndk root
d:/android/workspace/helloworld => helloworld project
d:/android/workspace/mylib => mylib project library

因此,libmylib.so的路径为:d:/android/workspace/mylib/libs/armeabi。
不幸的是,这似乎不起作用。如果我从ndkfoo.cpp中删除对mylib的任何引用,它甚至可以在我的手机上编译和运行。如果我不删除对mylib的引用,则会编译但无法链接:我得到以下结果:
D:/android/android-ndk-r6b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld.exe: 无法找到-lmylib
附言: 我忘了提到我在helloworld项目的jni目录下运行ndk-buld。 补充说明: 我在互联网上找到了很多类似的问题。 我一直使用Visual C / C ++ IDE,所以对GCC,makefile等非常陌生…

1
好的,找到了解决这个问题的方法。由于某种我不理解的奇怪原因,指定路径为-L/cygdrive/d/android/workspace/mylib/libs/armeabi是无效的(这就是为什么使用LOCAL_PATH会导致错误)。相反,使用-Ld:/android/workspace/mylib/libs/armeabi或-L../../mylib/libs/armeabi是有效的。我想这里可能是cygwin的问题... - Luke
如果解决了您的问题,请将评论发布为答案。 - m-ric
1个回答

1

这条信息表明链接器找不到您的库,这可能是由于LD_LIBS路径出现问题导致的。

我认为my-dir宏不包括设备单元标识符,因此您的LOCAL_PATH变量应该省略D:,并且我认为它在cygwin上无法工作。我是Linux用户,不是100%确定,但如果您将

LOCAL_PATH := $(call my-dir)

LOCAL_PATH := D:$(call my-dir)

它应该可以工作。另一方面,您始终可以通过设置相对路径来设置:

LOCAL_LDLIBS += -L$../../mylib/libs/armeabi/ -lmylib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接