如果我们需要用到第三方提供的动态库,需要先使用预编译,把第三方的动态库安装到libs目录,然后在需要调用的文件的Android.mk里使用
LOCAL_SHARED_LIBRARIES += 来链接这些动态库。
实施步骤:
1.在jni下新建一个文件夹,把第三方动态库放进去,并添加Android.mk,形如以下:
include $(CLEAR_VARS)
LOCAL_MODULE := xxx1
LOCAL_SRC_FILES := libs/libxxx1.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := xxx2
LOCAL_SRC_FILES := libs/libxxx2.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := xxx3
LOCAL_SRC_FILES := libs/libxxx3.so
include $(PREBUILT_SHARED_LIBRARY)
2.如果在mycode.c调用第三方库函数,则在编译mycode.c时加入依赖,形如以下:
LOCAL_SHARED_LIBRARIES += \
libxxx1 \
libxxx2
libxxx3
后记
有一次使用第三方库,在cygwin下编译出现下面的错误:
D:/software/android/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/. ./lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot open ./obj/local/armeabi-v7a/libxxx1.so: Permission denied
D:/software/android/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/. ./lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot open ./obj/local/armeabi-v7a/libxxx2.so: Permission denied
D:/software/android/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/. ./lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot open ./obj/local/armeabi-v7a/libxxx3.so: Permission denied
collect2: ld returned 1 exit status
/cygdrive/d/software/android/android-ndk-r8e/build/core/build-binary.mk:450: recipe for target `obj/local/armeabi-v7a/liblinphone.so' failed
make: *** [obj/local/armeabi-v7a/liblinphone.so] Error 1
解决办法:错误是权限问题,于是使用chmod 777 libxxx1.so,修改libxxx1.so、libxxx2.so、libxxx3.so即可。