android NDK 之Hello world

每次看一家写的好的博客,都是很清晰明了,写的是相当好啊。我自己一写,本来清清楚楚的事情,到我这里一写就挂了,看来是水平相当的不靠谱啊。以后有时间再整理吧,反正水平就是这个样子,后面多整理一下,可能效果好一点。最近看了看android NDK方面的知识,小结一下。我对NDK理解不深,用hello world简单走了一遍流程,算是知道了个大概,以后要用的时候,还是要认真看一下google的文档啦。

一 我们为什么要使用NDK

  为了在Android OS系统上开发应用程序,Google提供了两种开发包:SDK和NDK。看这篇文章的,一般都知道SDK做什么的啦,不多说了。而NDK则是Google提供的交叉编译工具链, 能够编译出在手机平台下执行的二进制库文件,能使Android开发者把从c/c++编译而来的本地代码嵌入到应用包中的一系列工具的组合。android 体系底层为Linux内核,之上提供一些C/C++函数库,因此Android 应用开发也可以使用C /C++开发,这就是Android NDK开发包的价值所在了。我们用NDK,一般有以下原因,1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的。便于移植,用C/C++写得库可以方便在其他的嵌入式平台上再次使用。就我而言,我就是防止别人反编译我的java代码,就知道我是怎么和服务器通信的。而C++代码的反汇编,就很难理解了,所以防得了一部分人,特别特别的高手,就防不了啦。这方面的书,《Android NDK Beginner's Guide》,《Pro Android C++ with the NDK》《android高级开发实战------UI、NDK与安全》,《细说Android 4.0 NDK编程》

二 NDK的基本开发流程是什么样子的

   1 编译出适合不同手机平台的.so动态链接库。2 将.so文件用于需要这个链接库的工程中。听起来很简单吧,确实也是。

三 如何生成.so动态链接库

    我的电脑是ubuntu14.04 64位版本,IDE是android studio1.1.0,java是1.7版本,SDK和NDK都已经设置好了环境变量。下面我们都开始搞一个hello world的so文件吧。

   第一步就是新建一个工程,如图所示


然后,在工程里新建一个类push,如下


编写内容如下:



然后再在IDE的菜单“build”的选项中选择“make project”,那么这个工程就被编译过了。这样就会在/app/build/intermediates/classes/debug/meihuan/quake目录下生成push.class文件。下面我们就要使用javah工具,来生成这个push.java文件的.h版本。


这个时候你应该通过terminal,将自己切换到/app/src/main目录下,在这里输入命令

javah -d jni -classpath ../../build/intermediates/classes/debug/ meihuan.quake.push

如果成功,会在/app/src/main下面生成一个文件夹jni,里面会有一个文件meihuan_quake_push.h。在生成了.h以后,内容如下:


,有个.h文件以后,我们只需要把这个.h文件实现了就可以了。我们手动写一个文件meihuan_quake_push.cpp,内容如下:


那么在jni目录下就有了meihuan_quake_push.h 和meihuan_quake_push.cpp两个文件,这个时候我偷懒一下,从NKD的samples目录下找到hello-jni目录,在这个目录下也有一个文件夹jni,把里面的Android.mk和Application.mk文件拷贝到我们工程的jni目录下,打开Android.mk,我们修改成内容如下:


然后就是在当前的jni目录下执行ndk-build命令,如果成功的话,就会在jni的上一级目前生成两个文件夹,一个是libs,一个obj,打开libs目录,你会看到如下


那么生成的libmhquake.so文件就分别在这些目录下面。到此为止,已经生成了.so文件,应该没有什么问题。如果你的.so文件用到了android的东西,那么在生成.h文件的过程中还要指定SDK中的android目录,这个以后用到的时候再说吧。

四 我们该如何使用.so文件


    我们上面已经生成了.so文件,对应不同CPU平台的手机,我们有不同的.so,那么我们下面说一下如何使用这些so文件。

我们新建一个工程,在/app/src/main目录下新建一个文件夹jniLibs,里面放上上文中生成的libs文件夹下的所有文件夹,如armeabi,x86等文件夹。然后把上面工程中的push.java文件也要拷贝到新工程中,放到相应的目录下。如果和新建的工程不是一个包名,则在下面新建文件夹,主要就是把push.java文件放对目录就可以了。然后就可以在工程中使用了。如下图所示



然后点“ctrl+F9”,编译工程,就可以生成调试的APK文件了。

以上是一个基本流程,很多东西 想说明白,但没有说,因为没有想好怎么组织才好。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值