Android的NDK開發(2)————利用Android NDK編寫一個簡單的HelloWorld

來源:互聯網
上載者:User

/********************************************************************************************
 * author:conowen@大鐘                                                                                                                          
 * E-mail:conowen@hotmail.com                                                                                                             
 * http://blog.csdn.net/conowen                                                                                                              
 * 註:本文為原創,僅作為學習交流使用,轉載請標明作者及出處。     

 ********************************************************************************************/


1、Android NDK簡介

NDK全稱為native development kit本地語言(C&C++)開發包。而對應的是經常接觸的Android-SDK,(software development kit)軟體開發包(只支援java語言開發)。

簡單來說利用NDK,可以開發純C&C++的代碼,然後編譯成庫,讓利用Android-SDK開發的Java程式調用。NDK開發的可以稱之為底層開發或者jni(java  native interface)層開發,SDK開發可以稱為上層開發。

2、為何要用NDK

2.1、眾所周知,利用SDK編寫的代碼,產生的APK,很容易就可以反編譯了,安全性極為不高,而利用NDK開發的庫,不容易被反編譯,保密性,安全性都提高了。

2.2、很多開源工程和大型工程都是C&C++代碼,把它們轉換為純java語言顯然是不可能的。

2.3、C&C++的代碼運行速度和效率都比java快很多。

3、NDK環境的搭建

在http://developer.android.com/sdk/ndk/index.html下載最新版的NDK,然後解壓到你喜歡的位置,然後把NDK的所在的目錄,配置到環境變數裡面就行。

如我在windows下面用cygwin開發。配置環境變數可以參考http://blog.csdn.net/conowen/article/details/7518870

簡單來說就是在linux或者cygwin的安裝目錄,跳轉到/home/YourName/,然後編輯.bash_profile檔案,在末尾添加如下語句,具體根據自己的情況而定。

   ndk=/home/conowen/android-ndk-r7b    export ndk

4、建立一個NDK工程

建立一個目錄,命名為HelloWorld,然後在裡面建立一個名為jni的目錄(名稱一定要是jni,因為ndk-build的時候會在HelloWorld目錄下尋找jni的目錄,然後進行build),在jni目錄下建立如下檔案HelloWorld.c和Android.mk。

HelloWorld.c檔案代碼如下(此JNI是沒有jni_onLoad函數的)

#include <string.h>#include <jni.h>jstringJava_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI( JNIEnv* env,                                                  jobject thiz ){    return (*env)->NewStringUTF(env, "HelloWorld! I am from JNI !");} /*注意,這裡jstring 表示傳回值Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI寫法是Java+Android工程的包名+Android工程的Activity名+方法名,點號用底線表示,這個寫法很嚴格。包名:com_conowen_helloworldActivity名:HelloWorldActivity方法名:helloWorldFromJNIJNIEnv* env, jobject thiz是Native方法內建的參數,可以用來轉換一個資料類型。也就是說其實這個helloWorldFromJNI是沒有形參的。*/

Android.mk代碼如下

關於Android.mk的編寫格式,下一篇博文補全

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)#LOCAL_MODULE表示產生的庫的名字,前面的lib和尾碼名不用寫LOCAL_MODULE    := HelloWorldLOCAL_SRC_FILES := HelloWorld.cinclude $(BUILD_SHARED_LIBRARY)

然後在終端裡面,轉到HelloWorld目錄下,執行

$ndk/ndk-build

$ndk是之前配置的NDK環境變數。編譯成功後,會在在目錄產生libs和obj兩個檔案夾,libs裡面有剛剛編譯成的libHelloWorld.so庫。

5、建立一個Android工程

在eclipse裡面建立一個Android工程,java代碼如下,然後把剛剛產生的libs檔案夾拖到Android工程目錄下。

package com.conowen.helloworld;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;public class HelloWorldActivity extends Activity {    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        TextView tv = new TextView(this);        tv.setText(helloWorldFromJNI());        setContentView(tv);    }    public native String helloWorldFromJNI();// native聲明,表示這個方法來自Native層。實現過程已經在native層實現了    static {        System.loadLibrary("HelloWorld");// 載入庫,前面的lib和,尾碼名不用寫    }}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.