如何在Android中使用編譯好的.so庫【轉http://billhoo.blog.51cto.com/2337751/1125559】

來源:互聯網
上載者:User
來源: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”函數,現有介面如下:

  1. JNIEXPORT jint JNICALL 
  2. Java_com_nativetools_NativeDemo_max(JNIEnv *env, jobject jthis, jint a, jint b); 

        根據上述介面的描述,為了在本項目中使用這個介面,我們需要建立包“com.nativetools”,並在本包下建立類“NativeDemo”,如下:

        接著在類“NativeDemo”中載入庫“libDemoModule.so”,並對本地方法“max”進行聲明如下:

  1. package com.nativetools; 
  2.  
  3. public class NativeDemo { 
  4.     static { 
  5.         //載入需要使用的庫 
  6.         System.loadLibrary("DemoModule"); 
  7.     } 
  8.  
  9.     //對庫中的本地方法進行聲明 
  10.     public native int max(int a, int b); 

        這裡需要注意“System.loadLibrary("DemoModule")”中的“DemoModule”由我們的庫名去掉首碼“lib”和尾碼“.so”而來,並且大小寫敏感,否則會出現諸如找不到函數的實現、載入庫初始化失敗之類的錯誤,比如我們把大寫“D”改成小寫“d”,報錯如下,也為大家遇到錯誤後進行修正提供一個參考:

        然後,然後事情就結束了,我們剩下要做的僅僅是在需要使用max函數的地方匯入我們的工具包並調用max進行相關計算:

  1. ... 
  2. //匯入本地方法所在工具包 
  3. import com.nativetools.NativeDemo; 
  4.  
  5. public class MainActivity extends Activity { 
  6.  
  7.     @Override 
  8.     protected void onCreate(Bundle savedInstanceState) { 
  9.         super.onCreate(savedInstanceState); 
  10.         setContentView(R.layout.activity_main); 
  11.          
  12.         NativeDemo nativetool = new NativeDemo(); 
  13.          
  14.         //調用本地函數max 
  15.         Integer i = nativetool.max(1024, 512); 
  16.         new AlertDialog.Builder(this).setMessage(i.toString()).show(); 
  17.     } 
  18. ... 

        可以看到庫中的“max”函數已經成功調用,需要注意的是,android端聲明native code的代碼需要嚴格按照JNI介面來組織,及本例中,JNI介面為

        這也是我們為什麼要在項目中加入“com.nativetools.NativeDemo”這個類的原因。

Summary

        bill自己也是剛接觸類似第三方庫的使用,打心底裡覺得本文還差很多東西,但自己也沒法說清楚,於是僅僅將自己當前如何使用.so的方法進行了簡要的說明,希望在以後的學習和工作中,能夠深入而具體的習得這方面的知識和技巧。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.