java很强大,但是速度很慢,所以在很多方面都需要用到c++和java的混合编程。网上的步骤讲解很详细,这里就不加赘述,添加我认为比较重要的几点东西,希望对大家有用。总的来说就一句话,写一个java类,然后构建与之映射的c++头文件。
一.流程:
1.配置NDK,生成jni文件夹。里面的cpp文件,用来实现功能。Android.mk文件用来声明cpp文件。之后的c++源文件,头文件都放在这里。
2.创建一个java类,在里面写上你要用的native方法。这个类的作用相当于我们开发时使用的接口,就当是中介吧,接下来的任务就是实现这些方法。
3.java到c++的映射。生成与上面的java类相联系的头文件,方法有两种。第一种是在终端生成,第二种是使用ant编程实现(方便实用)。最后生成的.h文件,就包含了java类里面需要实现的方法接口,然后创建.cpp文件实现代码,将头文件包含进去即可。
4.通过上述方法,可以直接调用java类里面的方法使用。 另外,也可以自己写.h .cpp文件,只要在Android.mk里面声明了,并且调用的时候加上“extern c”就可以了。
二.配置NDK
配置好路径之后,添加native support,就会出现jni文件夹
三.生成头文件
1. 在终端生成:进入./bin/classes 目录下,通过 javah –jni 包名.类名 生成头文件
3. 通过ant生成头文件(我失败了很多次,找到最后测试成功一种方法,build_headers.xml的代码如下)
自己创建build_headers.xml文件,使用ant打开,写好之后在ant控制台用添加进来。当在创建好连接的类里面添加新方法时,只要双击控制台里面的目录就可以更新。
<?xml version="1.0" encoding="UTF-8"?>
<!-- ======================================================================
2015-3-29 上午10:05:09
NDKtest
description
Gloria
====================================================================== -->
<project name="NDKtest" default="BuildAllHeaders">
<description>
description
</description>
<!-- =================================
target: BuildAllHeaders
================================= -->
<target name="BuildAllHeaders" >
<antcall target="GetIntHeader" ></antcall>
</target>
<!-- - - - - - - - - - - - - - - - - -
target: depends
- - - - - - - - - - - - - - - - - -->
<target name="GetIntHeader">
<exec dir="${basedir}/bin/classes/" executable="javah">
<arg value="-d"/>
<arg value="${basedir}/jni/"/>
<arg value="-jni"/>
<arg value="com.wx.example.ndktest.GetInt"/>
</exec>
</target>
</project>
四.调用
自己动手操作一遍,遇到问题再解决就能学会了。我总结的不好,希望不吝赐教。