我的实践方法,以供将来参考。
-
先到Android官网下载开发工具ADT,该工具集成eclipse和Android SDK,可以管理Android SDK和相关开发插件,下载地址:http://pan.baidu.com/s/1mgn2dOs
-
下载Android NDK,注意ADT版本在20之前可安装NDK插件。下载地址:http://developer.android.com/sdk/index.html
-
下载搞定之后,直接安装NDK即可。
-
集成NDK,打开Eclipse的Window->Preferences->Android->NDK配置NDK插件的路径,如下图:
-
接下来新建个NDK的小例子,先新建个Android工程NdkTest,再在工程上右键点击Android Tools->Add Native Support...,然后给我们的.so文件取个名字。添加成功后工程下后创建jni文件夹,如下图:myndk.cpp就是源文件,Android.mk就是编译配置。
-
编写.cpp程序,如下图:
-
编写android程序,如下图:这里先加载libmyndk.so文件,创建stringFromJNI接口方可调用。
-
执行android程序,执行先编译NDK文件,再编译java程序。
-
自动编译NDK文件配置。
-
先创建builer,Project->Properties->Builders->New,新建一个Builder,在弹出的Chooseconfiguration type对话框,选择Program,点击OK,如下图:
-
先创建名称NDK_Builer,在main选项卡中 先在“Location”中输入nkd-build.cmd的路径,在“WorkingDiretcoty”中选项工程目录,点击“Browse Workspace”来选取工程目录。如下图:
-
在Refresh选项卡中如下图配置:
-
在Build Options选项卡中选择如下配置,如下图:点击“Specify Resources…”勾选项目工程的“jni“目录,点击”finish“。
-
运行程序即可。如运行时崩溃,遇到java.lang.UnsatisfiedLinkError: stringFromJNI错误,解决办法:在C++文件中函数定义前添加extern"C"修饰,如下图:原因是:使用extern "C"修饰,编译器会按C语言的方式编译和连接。在C语言中,函数编译之后函数名与C++函数编译之后不同,例如foo(int x, int y),C可能会编译成_foo的名字,而C++因为支持重载,所以会编译成像_foo_int_int这种带参数的函数名。如果是按照C语言的编译方式,调用foo函数是找不到_foo的函数名就会报出函数名找不到的错误。