android机制中,java代码的运行须依托于java虚拟机,效率是比较低的,最近做高效大数乘法中,发现使用NDK可以实现C与Java混编(能引用c的动态库,本次项目成功引用了gmp库),而且android中的C语言不需要依托java虚拟机,效率还是非常高的。

一、开发环境的搭建

要实现c与java混编,需根据自己的系统类型,额外下载android-ndk-r9d,linux系统安装命令如下方法:

$ cd android-ndk-r9d/$ build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.8 --platform=android-19 --system=linux-x86_64 --install-dir=$HOME/android-19-arm
同时 要为其添加环境变量,以便直接使用。具体步骤这儿不赘述了。

二、开发过程

整个过程总体流程是:

在java中声明与C的接口函数 -> javah命令导出.h的头文件-> 编写c程序

-> 编写Android.mk ->使用ndk-build编译C程序为动态库文件 -> android编译

1、java中声明C接口函数

public class func {static{System.loadLibrary("cfunc");// 预引用库(前不写lib后不写.so)}private native String jni_say();// 声明C程序中的接口函数}

2、导出.h头文件

利用终端进入工程目录,进入 /bin/classes

使用javah + 包名 + 类名 导出头文件

会看到当前目录下多了一个.h文件

使用NDK实现Android中C与Java交叉编程_第1张图片

使用NDK实现Android中C与Java交叉编程_第2张图片

3.编写c程序

首先在工程根目录下建一个名为“jni”的文件夹,将上步生成的.h文件复制过来,根据.h编写.c/.cpp即可

使用NDK实现Android中C与Java交叉编程_第3张图片

在接口中可以引用其他写好的c/c++函数/文件,需注意接口中的与java交互的数据类型与c/c++不一样,需另外学习下,其他的就一模一样了。

可参考:http://blog.sina.com.cn/s/blog_5de73d0b0101chk1.html

4.编写Android.mk

Android.mk作用类似Makefile文件,保存的是编译信息。

使用NDK实现Android中C与Java交叉编程_第4张图片

此处没有引用其它的.c/.cpp/库文件,如有引用的话,需修改Android.mk的代码,使其重新编译新的动态库。例如,如果接口对应了.cpp中引用了a.h,a.h中函数的实现存在a.cpp中。只需在Android.mk的 LOCAL_SRC_FILES 末尾添加”/a.cpp“即可。

详情可参考http://www.2cto.com/kf/201310/253386.html

5、使用ndk-build将c代码编译成动态库

直接在jni目录下使用ndk-build命令即可

使用NDK实现Android中C与Java交叉编程_第5张图片

这时,F5刷新一下,就能发现在android工程目录下的libs中会多一个armeabi文件夹,里面就是生成的动态库。

使用NDK实现Android中C与Java交叉编程_第6张图片

6、编写测试程序,Android端编译工程,运行调试

注意,jni项目只能采用真机测试,模拟器是跑不了的。

使用NDK实现Android中C与Java交叉编程_第7张图片

三、引用C语言库

代码写法与c语言相同,主要还是修改Android.mk来实现编译。具体参照上面提供的网址。





其它可参考资料:

http://zzbupt.iteye.com/blog/1876496nd

ndk-build的用法:http://blog.csdn.net/smfwuxiao/article/details/8523087




更多相关文章

  1. strcpy函数在android中的实现
  2. android http通过post上传文件和提交参数(通过拼装协议)
  3. EACCES (permission denied)解决办法 android 文件读写
  4. 【Android】用于打开各种文件的intent
  5. android 文件的读取与写入以及TextView的滚动
  6. aes文件读取

随机推荐

  1. 2013.11.28 ——— android 网络3g wifi
  2. android 关于图片的放大,缩小,旋转功能的实
  3. 自定义进度条
  4. Android(安卓)自定义Progress Bar
  5. FragmentTabhost记录
  6. A Visual Guide to Android(安卓)GUI Wid
  7. Android(安卓)Location 和 Sensor的使用,
  8. Android(安卓)ListView的子项的随意拖动
  9. Android(安卓)解析excel文件
  10. Android(安卓)P(api28) 不支持 http 协议