NDK基本使用步骤总结

我们的Android项目一直在使用不少动态库,但是我一直并没有接触过这边的开发,只是觉得流程应该大致是接近的。这里吐个槽,Android中使用C/C++开发太不容易了,这点在iOS中就太简单了,C++需要使用.mm文件进行连接一下,C直接写就好了,非常方便。前一段,需要实现一个功能,根据域名动态获取速度最快的那个IP,这个地方我使用了一个简单的下载作为测速手段。在iOS上面的开发很顺利,很快就搞定了,调试也顺利完成了,但是在Android上面就没这么简单了,不过最终下来整个流程比我现象中的还是要简单一些,官方提供的工具还是很高效的,希望Android studio快点对NDK进行支持,就不用这么费劲了。由于时间比较紧张,就没有去看官方的文档,随便百度了一下资料,发现几个不错的步骤和讲解,大致看了一下,就明白了基本步骤和原理。才发现原来这个开发流程的确是比较简单的,至少不用自己去写makefile那么复杂。


========================================================================

Mac下面NDK开发环境之前已经设置过,这里不再啰嗦,比较简单,把NDK下载下来之后,再设置一下path变量NDK_HOME就行。这里主要讲解Java调用C方法的步骤:

1. 在对应的Java类中定义要调用的native方法


2. 生成对应native方法的C方法名。首先找到你的Java文件编译后所在的class文件目录,这里由于我是使用Android studio开发,编译的class文件在intermediates -> classes 里面对应的product flavor目录下面。在这个目录下面执行javah 命令,就可以生成所需要的头文件,然后可以在头文件中看到相应的C方法的定义





3. 我并没有把这个native方法直接添加到原来的C文件中,而是额外建立了一个C文件,在这个文件中include那个需要的头文件,然后再在这个C文件中实现对应的方法名。这样好处是可以保证真正的功能文件是独立的,也好与iOS中的C文件保持一致。


这里需要注意的是调用方法的使用,在C和C++中是不一样的,我这里是C语言的调用方式进行调用。比如说:

C语言里要写成   tmpStr =(*env)->GetStringUTFChars(env,str,NULL);  
C++里 要这么写  tmpStr = env->GetStringUTFChars(str,NULL); 

同样需要注意的是,这里是虽然是C语言,但是对于JNI库提供的这些数据类型,其内存是JVM进行管理的,不用自己去做释放控制。关于C和Java中对应的数据结构关系,可以参考下面的文章:http://blog.csdn.net/xyz_lmn/article/details/6956003


4. 最后一步就是把C文件编译成动态链接库.so文件,这里我本来是先写Android.mk文件,然后再使用ndk-build进行编译的,但是总是提示我找不到manifest文件。无奈之后先使用eclipse创建一个工程,在工程目录下面直接建立一个目录"jni",把刚才C文件和Android.mk文件copy进去,再运行ndk-build就可以运行。。。。这个地方让人很无语,其实就是有个manifest做一些基本配置而已,并没有做其他任何的事情,我甚至没有把原先的java文件移过来,这个对使用Android studio的人来说真的不方便。

首先看一下Android.mk文件的编写,这里是从网上找的一个文件修改的,我修改了一下LOCAL_MODULE和LOCAL_SRC_FILES:


下面调用ndk-build命令即可


然后从libs目录下面把.so copy到需要的地方就行


5. 调用方法也比较简单


在这个类中,直接使用上面定义的gethostip方法就行


从上面几个步骤看来,发现实际NDK也是比较简单易懂的,比较麻烦的是google官方对于NDK工具支持的不足引起的,如果支持完善的话,在不开发比较复杂的功能时,JNI的使用无疑是非常简单的。我自己对于NDK的使用非常简单,很多地方也并没有去深入研究使用,只是最简单的能用而已


========================================================================

参考资料:

  1. 简单的开发流程:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=300194
  2. 非常不错的对JNI头文件的分析:http://blog.csdn.net/xyz_lmn/article/details/6959545
  3. 基本开发流程:http://blog.csdn.net/xyz_lmn/article/details/6955031
  4. 非常不错的使用eclipse开发NDK的讲解:http://blog.csdn.net/dengshengjin2234/article/details/10046809
  5. Java和C数据格式转换的问题:http://blog.csdn.net/cupidove/article/details/8024835

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值