天天看點

【如何在Android中使用編譯好的.so庫】

        首先還是按部就班地建立一個android示例工程“UseSharedLibDemo”,版本android-api9

<a href="http://blog.51cto.com/attachment/201301/131203114.jpg" target="_blank"></a>

        仍然不厭其煩地運作一次,以确定我們的Demo工作正常。

        輕按兩下打開項目樹,在“/libs”目錄下建立檔案夾“armeabi”(大小寫敏感),并将我們之前準備好的庫“libDemoModule.so”拷貝到該目錄下以備使用。

<a href="http://blog.51cto.com/attachment/201301/133852766.jpg" target="_blank"></a>

        對于該庫的使用,我們并不需要知道“max”這個函數是怎麼實作的,隻需要知道它的JNI接口就可以了,對于庫“libDemoModule.so”中的“max”函數,現有接口如下:

JNIEXPORT jint JNICALL 

Java_com_nativetools_NativeDemo_max(JNIEnv *env, jobject jthis, jint a, jint b); 

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

<a href="http://blog.51cto.com/attachment/201301/133332608.jpg" target="_blank"></a>

        接着在類“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”,報錯如下,也為大家遇到錯誤後進行修正提供一個參考:

<a href="http://blog.51cto.com/attachment/201301/140514475.jpg" target="_blank"></a>

        然後,然後事情就結束了,我們剩下要做的僅僅是在需要使用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(); 

<a href="http://blog.51cto.com/attachment/201301/135046457.jpg" target="_blank"></a>

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

<a href="http://blog.51cto.com/attachment/201301/135601554.jpg" target="_blank"></a>

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

Summary

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

<a href="http://down.51cto.com/data/2362215" target="_blank">附件:http://down.51cto.com/data/2362215</a>

     本文轉自Bill_Hoo 51CTO部落格,原文連結:http://blog.51cto.com/billhoo/1125559,如需轉載請自行聯系原作者

繼續閱讀