一、什麼是動態庫(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、動態庫缺點:運行時加載庫需要額外的時間,可執行文件體積較大,需要動態鏈接程序庫。
在實際應用中,如果一個庫用來被多個程序共享,那麼使用動態庫會更加優秀,但如果一個庫只會被一個程序使用,那麼可以使用靜態庫,避免運行時的加載等額外開銷。
原創文章,作者:ZFPKK,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/316770.html