一、什么是动态库(Shared Library)
动态库是指在程序运行时才会被加载的库,在程序执行时通过系统调用dlopen()函数加载动态库,通过dlsym()函数查找需要调用的函数,再通过dlclose()函数卸载动态库,使用动态库可以实现程序的模块化,减少程序的体积,提高程序的执行效率。
Android系统中动态库以.so文件的形式存在,Android应用也可以通过使用动态库来实现模块化。
二、如何使用loadlibrary加载动态库
1、编写动态库
#include<jni.h> JNIEXPORT jstring JNICALL Java_com_example_test_MainActivity_hello(JNIEnv* env, jobject obj){ return (*env)->NewStringUTF(env, "Hello World from dynamic library!"); }
2、将动态库编译为.so文件
$ gcc -shared -o libtest.so test.c
3、将.so文件放置到Android工程的libs/armeabi目录下
4、在Java代码中使用System.loadLibrary()加载动态库
public class MainActivity extends Activity { static { System.loadLibrary("test"); } public native String hello(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = findViewById(R.id.tv); tv.setText(hello()); } }
5、在Android.mk文件中声明动态库
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := test LOCAL_SRC_FILES := libs/armeabi/libtest.so include $(PREBUILT_SHARED_LIBRARY)
使用loadlibrary加载动态库可以使Android应用变得更加灵活,模块化。
三、动态库的优劣比较
1、静态库优点:编译时链接,不需要额外的加载时间,可执行文件体积小。
2、静态库缺点:每次程序更新都需要重新编译链接,编译时需要进行重复的链接。
3、动态库优点:可重用性高,一个动态库可以被多个程序共享,如果动态库有更新,不需要重新编译每个使用它的程序,只需要替换动态库文件即可。
4、动态库缺点:运行时加载库需要额外的时间,可执行文件体积较大,需要动态链接程序库。
在实际应用中,如果一个库用来被多个程序共享,那么使用动态库会更加优秀,但如果一个库只会被一个程序使用,那么可以使用静态库,避免运行时的加载等额外开销。