關於Android NDK的實驗筆記

來源:互聯網
上載者:User

一直想研究一下NDK的東西,卻總是因為項目中用不上而作罷,今天閑下來,HELLO WORLD了一把。

 

依例,做任何一件事情之前都先GOOGLE,果然,有不少關於NDK的文章,所以,做這個HELLOWORLD還是很簡單的,只是大家要注意因為NDK R4有一些改動,切不可拿以前的文章來依葫蘆畫瓢。

 

 

安裝步驟:

1. 下載,這個就不多說了,翻牆,下載 android-ndk-r4b-linux-x86.zip 或者 android-ndk-r4b-windows.zip。
註:我是在Ubuntu 10.4 32bit 案頭版上做的實驗,如果你用windows,則必須使用cygwin,網上有文檔可參考。

 

2.解壓縮即是安裝。一如既往的簡單。我放在 /usr/android-ndk-r4b 下面了。

 

 

寫個HELLO WORLD

1.用Eclipse IDE產生一個預設的最簡單的工程,就是那個只有一個TextView的Hello world. 注意包名,比如我的 cn.sharetop.android.hello.ndk,類名HelloNDKActivity。

2.去修改一下res/layout/main.xml,為那個沒有ID的TextView增加一個ID,比如 android:id="@+id/label" ,然後再修改這個HelloNDKActivity,如下:

 

public native String sayHello(String name);<br />...<br />static {<br /> System.loadLibrary("hello_jni");<br />}</p><p>@Override<br />public void onCreate(Bundle savedInstanceState){<br /> super.onCreate(savedInstanceState);<br /> setContentView(R.layout.main);</p><p> TextView label=(TextView)findViewById(R.id.label);<br /> label.setText(sayHello("中國"));</p><p>}<br />

   

3.進入工程所在目錄,比如我的 /home/yancheng/myworkspace/hello ,建立一個子目錄 sudo mkdir jni。

 

4.進入jni目錄,建立三個檔案(直接在eclipse裡建立即可),一是Android.mk 二是 hello_a.c,三是hello_a.h

 

5.在eclipse中編譯運行一下那個Activity,然後去 bin 目錄下面,弄出JNI的標頭檔,命令:javah cn.sharetop.android.hello.ndk.HelloNDKActivity ,它會處理 這個類中定義的native方面,得到一個檔案cn_sharetop_android_hello_ndk_HelloNDKActivity.h。

 

6.開啟這個標頭檔,把裡面的內容拷到hello_a.h中即可。這個東西自動產生的,就不多說了。

 

/* DO NOT EDIT THIS FILE - it is machine generated */<br />#include <jni.h><br />#include <string.h><br />/* Header for class cn_sharetop_android_hello_ndk_HelloNDKActivity */</p><p>#ifndef _Included_cn_sharetop_android_hello_ndk_HelloNDKActivity<br />#define _Included_cn_sharetop_android_hello_ndk_HelloNDKActivity<br />#ifdef __cplusplus<br />extern "C" {<br />#endif<br />/*<br /> * Class: cn_sharetop_android_hello_ndk_HelloNDKActivity<br /> * Method: sayHello<br /> * Signature: (Ljava/lang/String;)Ljava/lang/String;<br /> */<br />JNIEXPORT jstring JNICALL Java_cn_sharetop_android_hello_ndk_HelloNDKActivity_sayHello<br /> (JNIEnv *, jobject, jstring);</p><p>/*<br /> * Class: cn_sharetop_android_hello_ndk_HelloNDKActivity<br /> * Method: plus<br /> * Signature: (II)I<br /> */<br />JNIEXPORT jint JNICALL Java_cn_sharetop_android_hello_ndk_HelloNDKActivity_plus<br /> (JNIEnv *, jobject, jint, jint);</p><p>#ifdef __cplusplus<br />}<br />#endif<br />#endif</p><p>

 

7.現在編輯hello_a.c,寫實現代碼,很簡單:

 

#include "hello_a.h"</p><p>//所有JNI的函數都有這個JNIEnv 和 jobject ,可以用它做很多事情(具體參考 jni.h)<br />jstring JNICALL Java_cn_sharetop_android_hello_ndk_HelloNDKActivity_sayHello(JNIEnv * env, jobject thiz, jstring name){</p><p> //取參數轉成我們熟悉的char*<br /> const char* param=(*env)->GetStringUTFChars(env,name,0);<br /> //這兒好熟悉啊<br /> char * str=(char*)malloc(32*sizeof(char));<br /> strcpy(str,"hello ");<br /> strcat(str,param);</p><p> //釋放掉param<br /> (*env)->ReleaseStringUTFChars(env,name,param);<br /> //返回結果<br /> jstring ret= (*env)->NewStringUTF(env,str);</p><p> free(str);<br /> return ret;<br />}</p><p>

 

8.可以編輯那個Android.mk了,也相當簡單,因為我們只是一個Hello world,想複雜也不知如何複雜:

 

#設定工作目錄為目前的目錄<br />LOCAL_PATH := $(call my-dir)</p><p>#執行清空一下各個參數<br />include $(CLEAR_VARS)</p><p>#設定編譯出的模組名稱<br />LOCAL_MODULE := hello_jni</p><p>#設定源檔案清單<br />LOCAL_SRC_FILES :=hello_a.c</p><p>#執行產生共用庫<br />include $(BUILD_SHARED_LIBRARY)</p><p>

 

9.好了,還是在terminal下面,進入jni目錄下,執行編譯: /usr/android-ndk-r4b/ndk-build ,輸出如下:

 

Compile thumb : hello_jni <= /home/yancheng/workspace/HelloNDK/jni/hello_a.c<br />SharedLibrary : libhello_jni.so<br />Install : libhello_jni.so => /home/yancheng/workspace/HelloNDK/libs/armeabi</p><p>

10.回到eclipse,refresh一下,然後build,run,在手機上就可以看到了結果了。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.