之前寫了一篇JNI的使用,這裡其實也是JNI的使用,隻不過現在的使用更加友善,不需要什麼cygwin或者gnu去建立那邊麻煩,直接eclipse完成所有操作。
先前的一篇:http://xuzhiwei.blog.51cto.com/978424/976839
1、首先現在Android的SDK和NDK
<a href="http://s3.51cto.com/wyfs02/M01/2F/E4/wKioL1OiefrhCR4FAACBUy4ndXI621.jpg" target="_blank"></a>
2、sdk中以及內建了eclipse,打開eclipse并下載下傳CDT插件支援,一會兒寫c++使用。
3、配置NDK環境,windows->preferences->Android->NDK進行配置。
<a href="http://s3.51cto.com/wyfs02/M02/2F/E5/wKioL1OietPwXfUXAAIctFw-BEs361.jpg" target="_blank"></a>
4、建立項目
<a href="http://s3.51cto.com/wyfs02/M00/2F/E5/wKioL1OieyrhEMdGAAKr_JahOqI251.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M01/2F/E6/wKiom1OifPKw4a5FAAD38R0Tkd0164.jpg" target="_blank"></a>
自動為我們生成了JNI的目錄,以及編譯的Android.mk等檔案。
<a href="http://s3.51cto.com/wyfs02/M00/2F/E6/wKioL1OifMTAbDwsAADxiR32eA4998.jpg" target="_blank"></a>
6、好了,開始寫代碼。
建立NativeUtils.java
1
2
3
4
5
6
7
8
9
<code>package</code> <code>com.xzw.firstndk;</code>
<code>/**</code>
<code> </code><code>* 與c++的接口類,用來生成.h頭檔案</code>
<code> </code><code>* @author xzw</code>
<code> </code><code>*</code>
<code> </code><code>*/</code>
<code>public</code> <code>class</code> <code>NativeUtils {</code>
<code> </code><code>public</code> <code>static</code> <code>native</code> <code>String getWords();</code>
<code>}</code>
現在要生成.h的頭檔案,之前是在cmd裡面通過javah指令來生成的,這裡我們使用ant來自動為我們生成頭檔案。
建立build_headers.xml然後以ant editor的方式打開,使用快捷鍵ALT+/生成模闆。
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<code><?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"UTF-8"</code><code>?></code>
<code><!-- ====================================================================== </code>
<code> </code><code>2014-6-19 下午2:07:38 </code>
<code> </code><code>FirstNDK </code>
<code> </code><code>description</code>
<code> </code>
<code> </code><code>XMYJ </code>
<code> </code><code>====================================================================== --></code>
<code><</code><code>project</code> <code>name</code><code>=</code><code>"FirstNDK"</code> <code>default</code><code>=</code><code>"BuilderHeaders"</code><code>></code>
<code> </code><code><</code><code>description</code><code>></code>
<code> </code><code>description</code>
<code> </code><code></</code><code>description</code><code>></code>
<code> </code><code><!-- ================================= </code>
<code> </code><code>target: BuilderHeaders </code>
<code> </code><code>================================= --></code>
<code> </code><code><</code><code>target</code> <code>name</code><code>=</code><code>"BuilderHeaders"</code> <code>depends</code><code>=</code><code>"BuildNativeHeader"</code><code>/></code>
<code> </code><code><!-- - - - - - - - - - - - - - - - - - </code>
<code> </code><code>target: BuildNativeHeader </code>
<code> </code><code>- - - - - - - - - - - - - - - - - --></code>
<code> </code><code><</code><code>target</code> <code>name</code><code>=</code><code>"BuildNativeHeader"</code><code>></code>
<code> </code><code><!--</code>
<code> </code><code>destdir:輸出目标目錄</code>
<code> </code><code>classpath:類路徑</code>
<code> </code><code>class:要生成的類</code>
<code> </code><code>--></code>
<code> </code><code><</code><code>javah</code> <code>destdir</code><code>=</code><code>"./jni"</code> <code>classpath</code><code>=</code><code>"bin/classes"</code> <code>class</code><code>=</code><code>"com.xzw.firstndk.NativeUtils"</code><code>></</code><code>javah</code><code>></code>
<code> </code><code></</code><code>target</code><code>></code>
<code></</code><code>project</code><code>></code>
右擊運作ant,然後重新整理jni目錄就可以看到.h檔案了,也把一些依賴庫給我們建立好了,友善很多。
如圖
<a href="http://s3.51cto.com/wyfs02/M00/2F/E9/wKioL1OigSbi2Sv1AAFMqyN52e0911.jpg" target="_blank"></a>
打開com_xzw_firstndk_NativeUtils.h可以看到:
<code>/* DO NOT EDIT THIS FILE - it is machine generated */</code>
<code>#include <jni.h></code>
<code>/* Header for class com_xzw_firstndk_NativeUtils */</code>
<code>#ifndef _Included_com_xzw_firstndk_NativeUtils</code>
<code>#define _Included_com_xzw_firstndk_NativeUtils</code>
<code>#ifdef __cplusplus</code>
<code>extern</code> <code>"C"</code> <code>{</code>
<code>#endif</code>
<code>/*</code>
<code> </code><code>* Class: com_xzw_firstndk_NativeUtils</code>
<code> </code><code>* Method: getWords</code>
<code> </code><code>* Signature: ()Ljava/lang/String;</code>
<code>JNIEXPORT jstring JNICALL Java_com_xzw_firstndk_NativeUtils_getWords</code>
<code> </code><code>(JNIEnv *, jclass);</code>
現在開始實作,打開FirstNDK.cpp,引入.h頭檔案
<a href="http://s3.51cto.com/wyfs02/M00/2F/EA/wKioL1OiggvRaNqkAAJrQGLtjE8254.jpg" target="_blank"></a>
eclipse提示功能也是很不錯的,alt+/快捷快速提示,
<code>#include "com_xzw_firstndk_NativeUtils.h"</code>
<code> </code><code>(JNIEnv *env, jclass clazz){</code>
<code> </code><code>return</code> <code>env->NewStringUTF(</code><code>"hello firt ndk"</code><code>);</code>
好了,c++部分ok了,現在來調用咯。
<code>import</code> <code>android.app.Activity;</code>
<code>import</code> <code>android.os.Bundle;</code>
<code>import</code> <code>android.widget.TextView;</code>
<code>public</code> <code>class</code> <code>MainActivity </code><code>extends</code> <code>Activity {</code>
<code> </code><code>TextView resultText;</code>
<code> </code>
<code> </code><code>@Override</code>
<code> </code><code>protected</code> <code>void</code> <code>onCreate(Bundle savedInstanceState) {</code>
<code> </code><code>super</code><code>.onCreate(savedInstanceState);</code>
<code> </code><code>setContentView(R.layout.activity_main); </code>
<code> </code><code>resultText = (TextView)findViewById(R.id.result);</code>
<code> </code><code>//調用c++的輸出,顯示出來</code>
<code> </code><code>resultText.setText(NativeUtils.getWords());</code>
<code> </code>
<code> </code><code>}</code>
<code> </code>
<code> </code><code>static</code><code>{</code>
<code> </code><code>System.loadLibrary(</code><code>"FirstNDK"</code><code>);</code>
完成了,預設生成的是armeabi架構的so檔案,如果需要生成多中架構的支援的so,需要在jni目錄下建立Application.mk檔案。
<code>APP_ABI :=armeabi armeabi-v7a x86</code>
添加好了,運作起來就可以在libs目錄下看到這幾個架構的檔案夾了。搞定手工了。
本文轉自xuzw13 51CTO部落格,原文連結:http://blog.51cto.com/xuzhiwei/1428192,如需轉載請自行聯系原作者