1. 程式人生 > >android中呼叫共享庫.so的幾種方法

android中呼叫共享庫.so的幾種方法

底層呼叫共享庫中函式的方法

> 首先使用dlopen("libmedia.so", RTLD_LAZY); 載入對應的庫檔案libmedia.so;

> 之後使用dlsym(libhandle, "function_name"); 獲取指定函式的指標;

> 最後使用獲取的函式指標呼叫對應的函式,執行相應的操作;

需要注意的是,呼叫的共享庫都必須在對應的Android.mk的共享庫中新增;

android呼叫第三方共享庫.so

1.將SO檔案直接放到libs/armeabi下,然後程式碼中System.loadLibrary("xxx");再public native static int  xxx_xxx_xxx();接下來就可以直接呼叫xxx_xxx_xxx()方法;

2.第二種方案,建立自己的SO檔案,在自己的SO檔案裡呼叫第三方SO,再在程式中呼叫自己的SO,這種比較複雜,需要建java類檔案,生成.h檔案,編寫C原始檔include之前生成的.h檔案並實現相應方法,最後用android NDK開發包中的ndk-build指令碼生成對應的.so共享庫;

> 首先要看這個SO是不是JNI規範的SO,比如有沒有返回JNI不直接支援的型別。也就是說這個SO是不是可以直接當作JNI來呼叫。如果答案是否定的,你只能選第二個方案。

> 還要看你是不是希望這個SO的庫直接暴露給JAVA層,如果答案是否定的,你只能選第二個方案,比如你本身也是一個庫的提供者。

> 看能不能直接從JAVA呼叫的最簡單的方法就是看SO裡的函式名是不是Java_XXX_XXX_XXX格式的,是就可以,你可以自己寫一個配套的JAVA檔案,注意一下SO函式名和JAVA函式名的轉換規則,或者向SO提供方索要;

> 使用第三方動態庫,應該至少有2個檔案,一個是動態庫(.so),另一個是包含動態庫API宣告的標頭檔案(.h)