如何生成android端可用so

此文目的:
1.備忘錄,方便自己今後查閱;
2.方便與大家交流和學習。
此文只是對所查閱的資料進行了整理。
說明:
1.以下兩種方法在linux系統下或cygwin均可實現,本文是在linux系統下進行環境配置。
2.此文中所用NDK版本:Android-NDK-r6

一.android端so與Linux端so區別
android端處理器是arm處理器,一般PC端Linux系統使用x86處理器。所以,Linux端直接編譯生成的so無法在
android端使用。

二.生成android端so
生成android端so有兩種方法:
第一種:使用Android.mk文件和ndk-build命令
環境搭建:
1.下載NDK並解壓壓縮包:
android-ndk-r6-linux-x86.tar.bz2
解壓後:(解壓路徑自定義)
android-ndk-r6

2.配置環境變量:
打開 /root/.bashrc,在文件最後添加NDK路徑,如下:
export PATH=$PATH:/opt/androidEnv/android-ndk-r6(即NDK解壓後的目錄所在路徑)
添加完畢後,執行以下命令,使新增環境變量生效:
source /root/.bashrc
執行完畢後,在終端輸入以下命令:
env
可查看PATH的值,如PATH的值中存在 /opt/androidEnv/android-ndk-r6,則環境變量設置成功。

3.生成so的實例:
說明:此文中不闡述JNI相關的代碼實現。
實例實現步驟:
01:創建AndroidsoTest目錄;
02:在AndroidsoTest目錄下創建jni目錄(jni目錄必須存在);
03:jni目錄下存放如下三個文件(源文件和Android.mk文件必須存放於jni目錄下):
JNItest.h  JNItest.c Android.mk
Android.mk文件來源:從NDK解壓出的包中拷貝而來,路徑如下:
/opt/androidEnv/android-ndk-r6/samples/hello-jni/jni
JNItest.h和JNItest.c文件爲自己編寫。(編寫中所用JNI API相關不闡述)
04:對Android.mk文件進行修改,改爲合適自己的項目。Android.mk文件中有如下幾行:
/×××××××××××××××××××××××××××××××××××××××/
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

/×××××××××××××××××××××××××××××××××××××/

修改之後:
/××××××××××××××××××××××××××××××××××××/
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := test        //此行決定生成的so文件的名稱,此文中生成libtest.so
LOCAL_SRC_FILES := JNItest.c    //所要編譯的c文件

include $(BUILD_SHARED_LIBRARY)
/××××××××××××××××××××××××××××××××××××/

05:使用ndk-build進行編譯
打開終端,目錄切入此測試項目所在的目錄(即Android.mk所在目錄),然後輸入以下命令:
ndk-build
注:ndk-build所在路徑已加入環境變量,所以可直接使用。

06:so文件已經生成
ndk-build執行完畢後,目錄結構如下:
在AndroidsoTest目錄下,存在以下三個目錄:
jni libs obj
其中,libs和obj爲新生成目錄,且so文件存在於libs目錄下。

此方法,建議參考書籍《細說Android4.0 NDK編程》

第二種:使用arm-linux-androideabi-gcc編譯生成so文件
此方法與第一種方法的區別:
第一種方法直接使用ndk-build命令,無需自己編寫makefile;
第二種方法不使用ndk-build命令,需自己指定編譯所用gcc(其實就是編譯工具鏈下的arm-linux-androideabi-gcc)
1.環境搭建
1.下載NDK並解壓壓縮包:
android-ndk-r6-linux-x86.tar.bz2
解壓後:(解壓路徑自定義)
android-ndk-r6

2.使用NDK,創建自己的編譯工具鏈:
進入android-ndk-r6目錄,輸入如下命令(命令均在同一行):
$/build/tools/make-standalone-toolchain.sh --platform=android-5 --install-dir=/opt/androidEnv/myToolchains/toolchain-ndk-r6
其中,--install-dir的路徑需自定義。

3.配置環境變量:
打開 /root/.bashrc,在文件最後添加如下一行:
export PATH=$PATH:/opt/androidEnv/myToolchains/toolchain-ndk-r6/bin
添加保存後,執行如下命令,使新增環境變量生效:
source /root/.bashrc

命令執行完畢後,使用以下命令可查看環境變量設置是否成功:
env

4.so文件生成實例:
01:創建AndroidsoTest目錄;
02:AndroidsoTest目錄下存在如下兩個文件:
JNItest.h JNItest.c
03:打開終端,切到AndroidsoTest目錄,執行如下命令:
./arm-linux-androideabi-gcc JNItest.c -fPIC -shared -o libtest.so

注:arm-linux-androideabi-gcc所在路徑已加入環境變量,所以可直接使用。
到此,Android端so文件生成完畢。如有錯誤,請大家糾正。


建議:進行JNI開發,最好搭建完整的android開發環境(JDK、Eclipse、SDK、ADT、NDK)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章