此文目的:
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)