我正在使用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
(因此,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 /臂-Linux的androideabi / 4.4.3 /../../../../臂-Linux的androideabi / bin / ld.exe:找不到-lmylib
聚苯乙烯。 我忘了提到我在helloworld项目的jni目录下运行ndk-buld。 PSS的。 我在互联网上发现了很多类似的问题。我一直使用Visual C / C ++ IDE,所以我对GCC,makefile等都很陌生......
答案 0 :(得分: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用户,我不是百分百肯定,但如果你替换
LOCAL_PATH := $(call my-dir)
通过
LOCAL_PATH := D:$(call my-dir)
它应该有用。另一方面,您始终可以通过设置:
来设置相对路径LOCAL_LDLIBS += -L$../../mylib/libs/armeabi/ -lmylib