【发布时间】:2011-11-13 21:13:13
【问题描述】:
我正在使用 cygwin 下的 Android NDK r6b(系统已正确更新)。我正在修改 hello-jni 示例以学习使用 NDK。由于我有一个用 C++ 编写的库,我希望在 hello-jni 中使用(实际上,我已经创建了一个名为 helloworld 的 prj,其中包含一个名为 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)
包括 $(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
包括 $(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/windo ws/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 等真的很陌生……
【问题讨论】:
-
好的,找到了解决这个问题的方法。由于一些我不明白的奇怪原因,指定为 -L/cygdrive/d/android/workspace/mylib/libs/armeabi 的路径不起作用(这就是使用 LOCAL_PATH 导致错误的原因)。相反,使用 -Ld:/android/workspace/mylib/libs/armeabi 或 -L../../mylib/libs/armeabi 确实有效。我想cygwin是这里的问题......
-
如果它解决了您的问题,请发表您的评论作为答案
标签: android-ndk abi linker-errors