5

我正在使用 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 := $(调用我的目录)

包括 $(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 等真的很陌生……

4

1 回答 1

1

讯息

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

表示链接器没有找到您的库,这应该来自 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
于 2012-10-04T20:31:51.120 回答