天天看點

Android之eclipse簡單NDK入門

   之前寫了一篇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-&gt;preferences-&gt;Android-&gt;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>&lt;?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"UTF-8"</code><code>?&gt;</code>

<code>&lt;!-- ====================================================================== </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>====================================================================== --&gt;</code>

<code>&lt;</code><code>project</code> <code>name</code><code>=</code><code>"FirstNDK"</code> <code>default</code><code>=</code><code>"BuilderHeaders"</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>description</code><code>&gt;</code>

<code>            </code><code>description</code>

<code>    </code><code>&lt;/</code><code>description</code><code>&gt;</code>

<code>    </code><code>&lt;!-- ================================= </code>

<code>          </code><code>target: BuilderHeaders              </code>

<code>         </code><code>================================= --&gt;</code>

<code>    </code><code>&lt;</code><code>target</code> <code>name</code><code>=</code><code>"BuilderHeaders"</code> <code>depends</code><code>=</code><code>"BuildNativeHeader"</code><code>/&gt;</code>

<code>    </code><code>&lt;!-- - - - - - - - - - - - - - - - - - </code>

<code>          </code><code>target: BuildNativeHeader                      </code>

<code>         </code><code>- - - - - - - - - - - - - - - - - --&gt;</code>

<code>    </code><code>&lt;</code><code>target</code> <code>name</code><code>=</code><code>"BuildNativeHeader"</code><code>&gt;</code>

<code>        </code><code>&lt;!--</code>

<code>        </code><code>destdir:輸出目标目錄</code>

<code>        </code><code>classpath:類路徑</code>

<code>        </code><code>class:要生成的類</code>

<code>        </code><code>--&gt;</code>

<code>        </code><code>&lt;</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>&gt;&lt;/</code><code>javah</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>target</code><code>&gt;</code>

<code>&lt;/</code><code>project</code><code>&gt;</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 &lt;jni.h&gt;</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-&gt;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,如需轉載請自行聯系原作者

繼續閱讀