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)

發佈了23 篇原創文章 · 獲贊 40 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章