文章摘自:http://zctya.blog.163.com/blog/static/1209178201181074018603/
目标:
利用NDK 生成 SO 库,使用 SO 库进行 JNI 调用,在 Android sdcard 创建文件并写入数据。
工具:NDK 1.6 、Eclipse for java 、android SDK 、Cygwin
一、下载 Cywin
从Cywin官网 http://www.cygwin.com/ 下载所需要的版本,这里仅介绍在Windows下使用 Cywin
二、下载 NDK
这个直接从Android 官网下载就好了,现在不用翻墙了。
www.android.com
三、安装 Cywin 参考 【eoe特刊】第七期:NDK.pdf 大家可以去看这个PDF
下载到的Cywin 的程序文件为 setup.exe 文件
1、双击这个文件,启动安装
2、下一步
3、在线安装
4、选择安装路径
![NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog](http://img.ph.126.net/abrgvvYlapZxQbdhWtkQVg==/2760988046571760647.jpg)
5、下载文件缓存路径
![NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog](http://img.ph.126.net/abrgvvYlapZxQbdhWtkQVg==/2760988046571760647.jpg)
6、选择网络连接方式
![NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog](http://img.ph.126.net/v2apPLjgwRSPcpT0jRdFRA==/1011339591338324519.jpg)
7、选择下载镜像站点,目前有一个最新的镜像是163.com,大家选择这个速度快,网易提供的源
![NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog](http://img.ph.126.net/7zwPvinVyEs8beYpvlL73g==/625718873244723597.jpg)
8、下载安装
![NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog](http://img.ph.126.net/hYl1T2NDO9bCKtNksHobIA==/1296755217722931967.jpg)
9、选择安装项
![NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog](http://img.ph.126.net/dwzPfOUGXsC5aW3HQbv0ww==/2533274790412840781.jpg)
10、启动 Cywin 测试
![NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog](http://img.ph.126.net/7lCRRI7EMp_QJfwxfP-e0A==/1122240732162321705.jpg)
11、 输入命令测试
![NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog](http://img.ph.126.net/ohdVSRJN5KyZBDPQK1tIYA==/1123929582022585325.jpg)
四、配置Cywin
先找到安装路径下的 .bash_profile 文件,
我的环境位于:
2.修改 /home/$your computer's login name$/.bash_profile 在其中添加下面两句
# 这个里面的f/Android/android-ndk-r6b是存放NDK的目录,我的是F盘下Android文件夹中的android-ndk-r6b文件夹就是NDK的目录 ANDROID_NDK_ROOT=/cygdrive/f/Android/android-ndk-r6b # 你懂的 export ANDROID_NDK_ROOT |
五、编译NDK实例( hello-jni),测试一下
我们使用NDK自带的一个例子来生成.so文件
生成 .so 的步骤 ①、在Cywin中, 首先跳转到NDK实例目录下面,
cd /cygdrive/f/Android/android-ndk-r6b//samples/hello-jni/ |
$ANDROID_NDK_ROOT/ndk-build |
# $ANDROID_NDK_ROOT/ndk-build Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver Gdbsetup : libs/armeabi/gdb.setup Gdbsetup : libs/armeabi/gdb.setup SharedLibrary : libhello-jni.so Install : libhello-jni.so => libs/armeabi/libhello-jni.so |
六、现在我们来写一个自己的程序来试一下.so,本人使用1.6以上版本
1.用Eclipse 创建一个Android程序,MyNDK
![NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog](http://img.ph.126.net/Vy1OlHho-cOisVg3Vb9GPQ==/591378926086024885.jpg)
2.
![NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog](http://img.ph.126.net/oattxzTBisvdJfzHltQE0g==/631911322732358441.jpg)
3.
![NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog](http://img.ph.126.net/TTQO_kp-b_4B2RJQXgUrmw==/1124211056999296233.jpg)
4.
![NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog](http://img.ph.126.net/GWPCNOsPhBza09X5PA39Iw==/2544252314504554899.jpg)
5 . 生成 JNI 头文件
下面生成JNI 头文件啦,使用 javah 命令,对 JNI..java 这个文件生成,别搞错啦!
使用cmd 进入 android 项目的 bin 目录中,然后执行 javah -classpath . -jni cc.androidos.jni.JNI 这个命令。别忘记包名!( ^_^)
![NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog](http://img.ph.126.net/K_U9zZeo-XKb3MWdQ0NmIw==/1114077957837712985.jpg)
生成了一个 cc_androidos_jni_JNI.h
打开看看:(里面都是c 语言的头文件声明)
![NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog](http://img.ph.126.net/tUxJW0PZ-AbMrc1LnJ8AOA==/1585830018804769600.jpg)
com_zctya_jni_MyJni .h 内容不变
com_zctya_jni_MyJni.c 的内容
![NDK入门实例,生成.so文件 - 心海飘云 - zctyas blog](http://img.ph.126.net/eXP03JJCY4RlSGXemrEdXw==/2776750645267560170.jpg)
在这里的代码会在运行的时候向sdcard 写入 12530文件夹中的bj12530.log文件中写入 数据”aaaa“。
7. 编译SO 文件
在NDK的主目录 android-ndk-r6b 下面有个 sources 文件夹中创建一个名为 myndk 的文件夹
不知道这里是为什么与网上的介绍不太一样
我这里需要在 myndk 文件夹下面再创建一个名为 jni 的文件夹,文件夹中有如下三个文件
这里的Android.mk文件中的内容如下
执行过程中
执行后,结果如
8、把生成的so库,放到Android 工程下面
把 libs 文件夹,复制到 android中MyNDK工程的主目录
9、启动模拟器测试:注明这里的12530文件夹和bj12530.log文件是原来创建好的
这里还有个疑问为什么别人用 make APP=××× -B 之类的就可以通过,而我就不行呢,郁闷中...,还望知者赐教
[ make APP=××× -B 是NDK1.4之前的版本 ]