NDK重新编译so库

NDK重新编译so库

先用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++ 作为静态库