標籤:android blog http io os 使用 ar java strong
今天學習了一下android NDK,所以記錄下來。據說NDK從r7開始內建編譯器,在windows上無需配置cygwin的環境。現在我使用NDK r10來開發。
上午搭建的NDK並寫了一個執行個體,不過並沒有很好的使用eclipse的功能,如果開發的話可能比較慢。
1)首先,在eclips中配置NDK路徑
在eclipse中點擊功能表列window-Perferences,配置NDK的路徑。圖一為NDK所在的路徑。
(圖一)
2)在工程中添加native lib
建立一個空白的Android工程,在根目錄上點擊右鍵Adnroid Tools - Add Native Support...
3)在彈出的對話方塊中輸入要建立的lib的名稱,點擊Finish,在工程目錄下會多出一個jni檔案夾,裡面有一個空白的cpp檔案和一個Android.mk檔案
這個Androd.mk檔案很短,下面我們來逐行解釋下:
LOCAL_PATH := $(call my-dir)
一個Android.mk 檔案首先必須定義好LOCAL_PATH變數。它用於在開發樹中尋找源檔案。在這個例子中,宏函數’my-dir’, 由編譯系統提供,用於返回當前路徑(即包含Android.mk file檔案的目錄)。
include $( CLEAR_VARS)
CLEAR_VARS由編譯系統提供,指定讓GNU MAKEFILE為你清除許多LOCAL_XXX變數(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...), 除LOCAL_PATH 。這是必要的,因為所有的編譯控制檔案都在同一個GNU MAKE執行環境中,所有的變數都是全域的。
LOCAL_MODULE := TestJni
編譯的目標對象,LOCAL_MODULE變數必須定義,以標識你在Android.mk檔案中描述的每個模組。名稱必須是唯一的,而且不包含任何空格。
注意:編譯系統會自動產生合適的首碼和尾碼,換句話說,一個被命名為‘hello-jni‘的共用庫模組,將會產生‘libTestJni.so‘檔案。
重要注意事項:如果你把庫命名為‘libTestJni’,編譯系統將不會添加任何的lib首碼,也會產生 ‘libTestJni.so‘,這是為了支援來源於Android平台的原始碼的Android.mk檔案,如果你確實需要這麼做的話。
LOCAL_SRC_FILES := TestJni.cpp
LOCAL_SRC_FILES變數必須包含將要編譯打包進模組中的C或C++原始碼檔案。注意,你不用在這裡列出標頭檔和包含檔案,因為編譯系統將會自動為你找出依賴型的檔案;僅僅列出直接傳遞給編譯器的原始碼檔案就好。
注意,預設的C++源碼檔案的副檔名是’.cpp’. 指定一個不同的副檔名也是可能的,只要定義LOCAL_DEFAULT_CPP_EXTENSION變數,不要忘記開始的小圓點(也就是’.cxx’,而不是’cxx’)
include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY表示編譯產生共用庫,是編譯系統提供的變數,指向一個GNU Makefile指令碼,負責收集自從上次調用‘include $(CLEAR_VARS)‘以來,定義在LOCAL_XXX變數中的所有資訊,並且決定編譯什麼,如何正確地去做。還有 BUILD_STATIC_LIBRARY變數表示產生靜態庫:lib$(LOCAL_MODULE).a, BUILD_EXECUTABLE 表示產生可執行檔。
MainActivity.java代碼如下:
package com.zhw.testjni;import android.os.Bundle;import android.app.Activity;import android.widget.TextView;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);TextView textView = new TextView(this);textView.setText(helloFromJni());setContentView(textView);}public native String helloFromJni();static {System.loadLibrary("TestJni");}}
TestJni.cpp代碼如下:
#include <jni.h>extern "C" jstring Java_com_example_testjni_MainActivity_helloFromJni(JNIEnv *env, jobject thiz) {return env->NewStringUTF("Hello From Jni");}
5)直接運行程式,可以在Console視窗中看到NDK build的輸出
運行結果如下
至於C/C++的編譯是怎麼實現的,我們可以查看一下工程的Properties
在Builders裡面有多了兩項,一個是CDT Builder,一個是Scanner Configuration Builder。
現有的工程添加Builder
如果工程裡面已經有jni目錄了,但是沒有配置C/C++的編譯器,高手們可以自己添加Builder,對於我這種愛投機取巧的小菜鳥,工程右鍵菜單,新添加一個空白的so,然後再刪除,CDT Builder和Scanner Configuration Builder就出來了。
上一篇就是使用添加Builder的。
【NDK開發】eclipseIntegration Environment使用NDK開發android