天天看點

如何生成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)