先用test2.cpp生成libhello.so,将该库放在源文件目录下,然后对该库进行再次编译,android.mk文件如下格式:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := foo-prebuilt LOCAL_SRC_FILES := libhello.so #LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := foo-user LOCAL_SRC_FILES := test.cpp LOCAL_LDLIBS := -llog LOCAL_SHARED_LIBRARIES := foo-prebuilt include $(BUILD_SHARED_LIBRARY) ----------------------------------------------------------------------------------- Application.mk文件如下: APP_ABI := armeabi-v7a APP_STL := gnustl_static 之后执行ndk-build即可,最终在armeabi-va7文件夹就会生成如上图的两个库了 如果想导出libhello的头文件加上LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include ps:在libs目录下放入两个SO文件,在java调用System.loadLibrary加载foo-user.so一个即可实现调用libhello.so的方法 多个*.so文件不能直接合并,因为其中已经没有重定向信息。但多个静态库文件是可以合并成一个动态库文件的。LOCAL_SHARED_LIBRARIES:
表示模块在运行时要依赖的共享库(动态库),在链接时就需要,以便在生成文件时嵌入其相应的信息。
LOCAL_LDLIBS:编译模块时要使用的附加的链接器选项。这对于使用‘-l’前缀传递指定库的名字是有用的。
没想到动态库在Android中有两种链接方式。
Application.mk; 加入 APP_STL := stlport_static 右边的值还可以换成下面几个:
system - 使用默认最小的C++运行库,这样生成的应用体积小,内存占用小,但部分功能将无法支持
stlport_static - 使用STLport作为静态库,这项是Android开发网极力推荐的
stlport_shared - STLport 作为动态库,这个可能产生兼容性和部分低版本的Android固件,目前不推荐使用。
gnustl_static - 使用 GNU libstdc++ 作为静态库