天天看點

Android調用so檔案(C代碼庫)方法詳解

一、為什麼調用c的dll要用源碼編譯成so庫 Android系統是基于linux核心的移動終端系統,而dll是在windows環境下生成和調用的c庫,是以不可以直接為android系統調用。 二、安裝 (I)安裝cygwin   1.下載下傳cygwin cygwin可以在windows上虛拟unix編譯環境,還内置了許多linux的編輯器等工具,可供選擇安裝。在本項目中cygwin主要用來編譯生成so庫。是以重在安裝gcc、make包。 到http://cygwin.com/setup.exe下載下傳安裝程式  

2.選擇“install from Internet”

Android調用so檔案(C代碼庫)方法詳解

3.選擇安裝目錄

Android調用so檔案(C代碼庫)方法詳解

4.選擇下載下傳存儲目錄

Android調用so檔案(C代碼庫)方法詳解

5.選擇“Direct Connection”

Android調用so檔案(C代碼庫)方法詳解

6.選擇一個鏡像點進行下載下傳

我一開始選了個感覺比較近的給力的mirrors.163.com(速度300-400k左右),結果下載下傳到51%不走了(1個小時左右),後來乖乖的換回mirrors.kernel.org速度有點慢,但安裝成功了(40k左右,出去溜達了,不知道用了多長時間,中午開始的晚上6點回來的)。  

7.Category欄找到All 點選右側使Default變成install,其他包預設。安裝即可。

Android調用so檔案(C代碼庫)方法詳解

8.測試。桌面點開改程式,輸入make-v,gcc-v指令測試。

Android調用so檔案(C代碼庫)方法詳解

(II)安裝ndk

1.下載下傳ndk(window.zip版本),例如android-ndk-r8-windows.zip

2.解壓到一個目錄,如D:\android\android-ndk-r8  

3.打開cygwin安裝目錄下home\Administrator\.bash_profile,并在末尾追加  

NDK=/cygdrive/d/android/android-ndk-r8  

export NDK  

(傳說要用vim或nodepad打開,否則cygwin不認,我本來就用的vim,是以沒試驗過直接用txt打開的後果)。  

4.重新啟動,輸入cd $NDK回車,界面應如下:

Android調用so檔案(C代碼庫)方法詳解

5.在cygwin下用cd換到d盤要先加/cygdrive/d 三、第一個調用so的Android工程 1.建立android工程(MyFirstJNI)  

2.修改代碼,如下:   [java] view plaincopy public class JniTest extends Activity   {   @Override   public void onCreate(Bundle savedInstanceState)    {   super.onCreate(savedInstanceState);   // setContentView(R.layout.main);   TextView tv = new TextView(this);   tv.setText(""+intFromJNI());   setContentView(tv);   }   public static native  int intFromJNI();//口   static    {   System.loadLibrary("MyFirstJNI");   }   }     其中intFromJNI為要從so中調用的函數。我們要先為so檔案生成.h檔案。 3.通過cygwin跳轉到bin\classes目錄下,然後輸入javah指令對.class檔案進行編譯。如: javah -jni com.will.myfirstjni.MyFirstJni 編譯成功會在classes目錄下生成.h檔案,如: com_will_myfirstjni_MyFirstJni.h 4.在項目中建立檔案夾jni,将.h檔案拷貝到其下,添加一個同名的.c檔案。将.h中的函數拷貝到.c中添加函數的參數。如下。 [cpp] view plaincopy #include <string.h>   #include <jni.h>   JNIEXPORT jint JNICALL Java_com_will_myfirstjni_MyFirstJni_intFromJNI(JNIEnv *k, jclass j)   {       return (jint)100000;   }     5.到ndk目錄sample\hello-jni\jni目錄下複制Android.mk檔案到工程的jni目錄。 主要修改如下兩行代碼: [html] view plaincopy LOCAL_MODULE    := MyFirstJNI   LOCAL_SRC_FILES := com_will_myfirstjni_MyFirstJni.c     LOCAL_MODULE--項目名 LOCAL_SRC_FILES--c檔案名   6.在cygwin中跳到jni目錄,輸入$NDK/ndk-build指令,進行編譯,此時會生成libs\armeabi\libMyFirstJNI.so檔案。如果沒有看到,右鍵refresh一下。

Android調用so檔案(C代碼庫)方法詳解

7.啟動模拟器,效果如下。  

Android調用so檔案(C代碼庫)方法詳解