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