且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

ndk 入门实例

更新时间:2022-08-13 10:16:49

引用: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 官网下载就好了,现在不用FQ了。
www.android.com
三、安装 Cywin 参考 【eoe特刊】第七期:NDK.pdf 大家可以去看这个PDF
下载到的Cywin 的程序文件为 setup.exe 文件 
1、双击这个文件,启动安装
ndk 入门实例
2、下一步

ndk 入门实例 
3、在线安装

ndk 入门实例 
4、选择安装路径

ndk 入门实例 

ndk 入门实例

 
5、下载文件缓存路径

ndk 入门实例 
6、选择网络连接方式

ndk 入门实例 
7、选择下载镜像站点,目前有一个最新的镜像是163.com,大家选择这个速度快,网易提供的源

ndk 入门实例 
8、下载安装

ndk 入门实例

 
9、选择安装项

ndk 入门实例 
10、启动 Cywin 测试 

ndk 入门实例 
11、输入命令测试

ndk 入门实例 
四、配置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

    其中前一句需要修改为你自己的路径,保存后,重新启动 Cygwin 。 注意:这里如果是中文 OS 使用记事本或者写字板打开编辑后,重新启动 Cygwin 会报错。
五、编译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文件生成成功
六、现在我们来写一个自己的程序来试一下.so,本人使用1.6以上版本 
1.用Eclipse 创建一个Android程序,MyNDK

ndk 入门实例 


2. 

ndk 入门实例 
3.

ndk 入门实例 
4.

ndk 入门实例 
5 生成 JNI  头文件

下面生成JNI 头文件啦,使用 javah 命令,对 JNI..java 这个文件生成,别搞错啦!

使用cmd 进入 android 项目的 bin 目录中,然后执行  javah -classpath .  -jni cc.androidos.jni.JNI 这个命令。别忘记包名!( ^_^


ndk 入门实例 
生成了一个cc_androidos_jni_JNI.h

打开看看:(里面都是c 语言的头文件声明)  
ndk 入门实例

 6.书写C 代码,写入数据

ndk 入门实例 
com_zctya_jni_MyJni
.h内容不变
  com_zctya_jni_MyJni.c的内容

ndk 入门实例 


在这里的代码会在运行的时候向sdcard 写入 12530文件夹中的bj12530.log文件中写入 数据”
aaaa“。
7.  编译SO 文件

在NDK的主目录 android-ndk-r6b 下面有个 sources 文件夹中创建一个名为 myndk 的文件夹
不知道这里是为什么与网上的介绍不太一样

我这里需要在 myndk 文件夹下面再创建一个名为 jni 的文件夹,文件夹中有如下三个文件

ndk 入门实例 

这里的Android.mk文件中的内容如下

ndk 入门实例 ndk 入门实例
 
执行过程中
ndk 入门实例 
执行后,结果如 

ndk 入门实例 

8、把生成的so库,放到Android 工程下面
ndk 入门实例

  
把 libs 文件夹,复制到 android中MyNDK工程的主目录

9、启动模拟器测试:注明这里的12530文件夹和bj12530.log文件是原来创建好的

这里还有个疑问为什么别人用 make APP=××× -B 之类的就可以通过,而我就不行呢,郁闷中...,还望知者赐教

 

 

 

[  make APP=××× -B 是NDK1.4之前的版本  

附相关源码:

ndk 入门实例 

http://u.115.com/file/bhixb5c3 NDK_demo.rar