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>
四.調用
自己動手操作一遍,遇到問題再解決就能學會了。我總結的不好,希望不吝賜教。