前期准备
1.下载NDK开发需要的工具包:https://developer.android.com/ndk/downloads/index.html,我使用的是r9d的开发包
2.配置ndk环境变量(后面要使用ndk-build命令,编译项目)
编译ndk目录下的demo项目
首先我们来看下ndk下载下来后自带的demo来运行一次,ndk下载下来后,解压,目录下有个sample目录,在Eclipse中导入hello-jni这个项目

打开cmd命令窗口,进入Eclipse工作空间中的hello-jni项目目录下(如果在导入Eclipse的时候,没有勾选复制到工作区空间,就要进入ndk下,反正就是进入hello-jni目录下),然后执行ndk-build命令(这就是前面说的先配置好ndk的环境变量,没配置的话,进入ndk解压目录在路径栏直接cmd然后回车)

OK,现在刷新一下Eclipse中的helloJni项目,你就能看到多了一个obj文件夹,下面就是so文件,然后就可以运行了,运行后的截图:

新建NDK项目
主要步骤:
1.在Java文件中编写JavaNative代码
2.使用javah命令根据native方法生成头文件
3.新建.c文件实现头文件
4.新建Android.mk文件
5.加载动态链接库
一:在Java文件中编写JavaNative代码
新建项目,在MainActivity中写上一句native代码

二:使用javah命令根据native方法生成头文件
在项目上右键-->新建文件夹名字为jni,打开cmd,进入项目所在目录(我的目录E:\eclipse4.5workspace\NDKProject),执行javah命令,可以先看下javah命令的一些参数:

OK,然后我们输入:javah -classpth bin/classes -d jni com.lhq.ndkproject.MainActivity,我们来解释下这句命令:
使用javah命令,指定你要加载的类的文件目录(-classpath),然后指定头文件文件输出目录(-d jni,指定到jni目录,因为我们前面新建了jni的文件夹,不新建也行,它会自动创建,在你执行javah命令的目录下),然后加上JavaNative代码所在类的完整类名(包名+类名,所以,上面的classpath的参数注意了,输入到你要生成的头文件的源文件所在的目录,不然会找不到),然后回车

但是出错了,说找不到activity,因为我们这个native方法是写在MainActivity里面的,但是MainActivity是继承了Activity的,它找不到Activity这个类(如果native方法是写在一个单独Java文件中,不会出这个错),我们更改下命令在bin/classes目录后加一个分号,然后去把Activity加进来,那怎么加进来呢?,去你的sdk目录下的platforms中随便找一个版本的然后进去,比如我进入的是android-21,然后目录下有个android.jar文件,我们要的就是它,复制下文件路径,在刚才命令classes的分号后面粘贴(如果是单独的Java文件就不需要这样),然后执行命令

再进入Eclipse刷新一下,在jni目录下多了一个.h的头文件

三:新建.c文件实现头文件
现在我们要实现这个头文件,新建一个.c为后缀的文件,随便叫啥,我取个hello.c

hello.c文件现在是空的,我们来实现它,在hello.c中需要新引入c的一些库的头文件:stdio,stdlib,当然还有自己的com_lhq_ndkproject_MainActivity.h头文件

然后到.h文件中找到我们开始在MainActivity中写的那个native方法所对应的头文件中的方法,到.h中找到这个方法,然后复制到刚修改过的.c文件中,做好相应修改保存

四:新建Android.mk文件
现在已经实现了头文件,接下来我们到ndk中的demo,就是我们前面运行的那个demo中,复制Android.mk这个文件到我们自己项目的jni目录下,并做相应修改:LOCAL_MODULE为编译后的so库名字(这个你想叫什么都行),LOCAL_SRC_FILES为你要编译的这个文件的路径

现在我们打开cmd命令窗口,进入当前项目目录下执行ndk-build命令,然后Eclipse中刷新项目,会发现多了一个obj文件夹,里面有我们刚编译的so动态链接库


五:加载动态链接库
编译好的so文件会在前面加上lib前缀,但是我们在加载的时候不需要写,直接写Android.mk中指定的文件名就行了

运行成功!!!

配置自动编译
到目前为止,我们的ndk项目就能正常运行了,但是,我们每改一次c代码都要手动的用ndk-build编译,那我们来配置下自动编译:
在项目上右击,然后选择properties,然后在弹出窗口中选择Builders,再点击new

然后选择Program点击ok

然后点击Browse File System

选择ndk目录下的ndk-build.cmd文件


OK,再配置下Working Direcroty,点击Browse Workspace选择自己的项目

OK,然后点击Build Optionsg勾选During auto builds然后点击OK,到此为止,项目就不用每次都手动ndk-build了

****************************************如果转载请注明出处***********************************************
网友评论