來源:http://billhoo.blog.51cto.com/2337751/1125559
在bill的上一篇文章【Win7下Android native code的編譯和調試】中,已經成功編譯並產生了一個動態庫“libDemoModule.so”(沒時間看前文的朋友,bill在本文後上傳了“libDemoModule.so”的附件,下載後按照本文所述也可進行相關實驗)。既然是庫,就是拿來用的,而比起編譯來說,使用就顯得順手多了。下面bill就簡單地介紹下如何在另外一個android應用程式中使用這個庫中的JNI介面“Java_com_nativetools_NativeDemo_max”。
首先還是按部就班地建立一個android樣本工程“UseSharedLibDemo”,版本android-api9
仍然不厭其煩地運行一次,以確定我們的Demo工作正常。
雙擊開啟項目樹,在“/libs”目錄下建立檔案夾“armeabi”(大小寫敏感),並將我們之前準備好的庫“libDemoModule.so”拷貝到該目錄下以備使用。
對於該庫的使用,我們並不需要知道“max”這個函數是怎麼實現的,只需要知道它的JNI介面就可以了,對於庫“libDemoModule.so”中的“max”函數,現有介面如下:
- JNIEXPORT jint JNICALL
- Java_com_nativetools_NativeDemo_max(JNIEnv *env, jobject jthis, jint a, jint b);
根據上述介面的描述,為了在本項目中使用這個介面,我們需要建立包“com.nativetools”,並在本包下建立類“NativeDemo”,如下:
接著在類“NativeDemo”中載入庫“libDemoModule.so”,並對本地方法“max”進行聲明如下:
- package com.nativetools;
-
- public class NativeDemo {
- static {
- //載入需要使用的庫
- System.loadLibrary("DemoModule");
- }
-
- //對庫中的本地方法進行聲明
- public native int max(int a, int b);
- }
這裡需要注意“System.loadLibrary("DemoModule")”中的“DemoModule”由我們的庫名去掉首碼“lib”和尾碼“.so”而來,並且大小寫敏感,否則會出現諸如找不到函數的實現、載入庫初始化失敗之類的錯誤,比如我們把大寫“D”改成小寫“d”,報錯如下,也為大家遇到錯誤後進行修正提供一個參考:
然後,然後事情就結束了,我們剩下要做的僅僅是在需要使用max函數的地方匯入我們的工具包並調用max進行相關計算:
- ...
- //匯入本地方法所在工具包
- import com.nativetools.NativeDemo;
-
- public class MainActivity extends Activity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- NativeDemo nativetool = new NativeDemo();
-
- //調用本地函數max
- Integer i = nativetool.max(1024, 512);
- new AlertDialog.Builder(this).setMessage(i.toString()).show();
- }
- }
- ...
可以看到庫中的“max”函數已經成功調用,需要注意的是,android端聲明native code的代碼需要嚴格按照JNI介面來組織,及本例中,JNI介面為
這也是我們為什麼要在項目中加入“com.nativetools.NativeDemo”這個類的原因。
Summary
bill自己也是剛接觸類似第三方庫的使用,打心底裡覺得本文還差很多東西,但自己也沒法說清楚,於是僅僅將自己當前如何使用.so的方法進行了簡要的說明,希望在以後的學習和工作中,能夠深入而具體的習得這方面的知識和技巧。