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

Luk*_*uke 5 abi linker-errors android-ndk

我在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:= $(调用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
Run Code Online (Sandbox Code Playgroud)

(因此,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

PS.我忘了提到我在helloworld项目的jni目录下运行ndk-buld.PSS的.我在互联网上发现了很多类似的问题.我一直使用Visual C/C++ IDE,所以我对GCC,makefile等都很新...

jcm*_*jcm 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)
Run Code Online (Sandbox Code Playgroud)

经过

LOCAL_PATH := D:$(call my-dir)
Run Code Online (Sandbox Code Playgroud)

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

LOCAL_LDLIBS += -L$../../mylib/libs/armeabi/ -lmylib
Run Code Online (Sandbox Code Playgroud)