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”


3.選擇安裝目錄


4.選擇下載存儲目錄


5.選擇“Direct Connection”


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

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

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


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


(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回車,界面應如下:


5.在cygwin下用cd換到d盤要先加/cygdrive/d
三、第一個調用so的Android工程
1.新建android工程(MyFirstJNI) 
2.修改代碼,如下:
 
[java] view plaincopy
public class JniTest extends Activity  
{/** Called when the activity is first created. */  
@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一下。


7.啓動模擬器,效果如下。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章