Android-Eclipse下开发JNI过程介绍

Android-Eclipse下开发JNI过程介绍

 

我们在开发应用程序的时候,经常会遇到调用底层的东西,并且底层很多都是用CC++编写的代码,而java是不能直接调用Android底层的。那该怎么办咧?这时候就需要用到JNI了,也就是本地方法调用。稍微熟悉一点Android开发的技术人员可能都了解,java层调用JNI的时候实质上的调用的一个.so文件,也就是说C/C++写的功能代码,最终还是被编译到了这个.SO文件中供java调用。那么问题就来了,怎样编译一个.so文件呢?或者说怎样编译一个.so文件更加方便简单呢?网上有很多关于JNI的教程,很多都用到了cygwinNDK工具。我觉得这样太麻烦,不知道大家怎么认为的。今天我就来总结一下,如何在Eclipse下直接进行JNI开发并编译。例子比较简单,主要是熟悉一下这个过程。

开始之前先说几句,由于我们是在Eclipse下开发JNI,需要支持C/C++语言,还有NDK编译环境。所以,大家要先把这些必要的环境搭配好。支持C++语言,需要在Eclipse下安装CDT插件,另外还有NDK的安装和路径配置,在这里就不详细介绍了,网上有很多这样的教程,不会的大家试着跟着教程搭建。

 

 

废话不多说,开始吧。

 

1,创建一个Android工程

这个就不多说了吧,跟我们平时创建Android项目一样,file -> new -> Android Application project.然后就会出现像这样的一个工程结构:

我创建的项目名是JNITest,大家可以看到,这就是一普通的App开发的项目结构,很简单。

2,创建一个调用JNI的接口

我是这样做的:新建一个包,在这个包里面创建一个自己的类。需要注意的是,创建的这个类要根据自己的实际情况来命名。比如说我这个例子要做的是一个简单是加法运算,具体的运算过程在C++语言中实现。创建好后大概是这样的:

 

我的类名叫JNIADD,类的实现是这样的:

 

3,使用javah生成类的头文件(.h

    

到了这一步之后,打开你的工作空间,我的在D:\android_workforce\JNITest\bin\classes,看看文件目录结构是不是这样的:

 

 

打开DOS窗口,进入到这个目录下面:

 

然后执行命令:javah com.test.jni.JNIADD(注意:包名+类名要对应正确)

 

这时候你回发现在D:\android_workforce\JNITest\bin\classes目录下面多了一个文件:

 

 

4,创建一个jni文件夹

在你的Eclipse工程下创建一个jni文件夹,把上一步生成的.h头文件复制到jni下面,这个jni文件夹就是我们开发jni的地方。

 

然后创建一个Android.mk文件,这个文件是android环境下编译需要用到的。另外再创建一个.h的实现,叫做xxxxx.cpp文件,命名和头文件一样,实现方式我这样用的cpp,也就是C++实现。创建好后Android.mk文件和xxxxx.cpp文件目前还是空的,先不管这个,把结构调好了再说。

 

5C++完成功能

先来说说Android.mk文件怎么写。其实这个文件很常见,你也可以拷贝,当然自己写也不难,主要是要弄清楚里面的细节。我直接给出贴图吧,再来解释。

 

解释一下:

LOCAL_MODULE    := jni_add

是你编译之后的.so的文件名,也就是

 

引用的名字,请注意保持一致,否则会报错的。

 

LOCAL_SRC_FILES := com_test_jni_JNIADD.cpp

C++类的名字。

 

下面看怎么实现C++代码:

 

 

看到这里,估计有些同学要问了,NIEXPORT jint JNICALL Java_com_test_jni_JNIADD_add

  (JNIEnv *, jobject, jint a, jint b)是什么东西啊,那么长?

别急,这也不是我写的,只是实现了一下而已。大家可以直接在.h头文件中拷贝一下。熟悉C++的朋友估计不会陌生,我们在C++中创建一个类的时候,一般都是在.h头文件中先声明,再到cpp文件中去实现。这里也就是这种情况。

 

6,编译运行

好了,开发完成了,下一步就是编译运行了。怎么编译,看下面:

右键项目--Android Tools--Add Native Surport,这时候会让你填一个lib*****.so的对话框,随便填一个,然后删除掉就可以了,对我们没用。

Eclipse切换到C/C++视图

 

同时会在工具栏显示一把锤子

 

这把锤子很重要,它是我们编译C++代码的工具。

点这个锤子开始编译我们项目中的C++代码,如果成功了,会出现下面情况:

 

 

项目机构也变了,会在libs下面多了一个目录,这个下面就是我们刚刚编译出来的.so文件。

 

 

有人可能有些奇怪:为什么生成的是libjni_add.so,而我们引用的是jni_add.so。这里简单说一下,java层调用JNI的时候默认把前缀lib去掉了,我们生成的.so文件前缀都是带lib的,如果我们引包的时候也带一个lib,名称就不对了,要报错的。

 

最后一步就是调用了很简单:

 

 

结果会在logcat打出:

 



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值