現在,在Android2.3版本裡,可以使用native_activity.h介面實現一個完整的native activity,在使用的時候,要確認回呼函數不能阻塞主UI線程。更多資訊,可以參考<ndk_root>/platforms/android-9/arch-arm/usr/include/android/native_activity.h.
Native_app_glue靜態輔助庫為另一個線程中的事件迴圈提供了回調,而且非常容易使用,可以參考native-activity樣本程式。下面是利用native_activity.h實現native activity程式的步驟:
1/ 在Eclipse中建立一個android項目,在項目的根目錄下建立一個jni目錄用於存放所有的本地代碼。
2/ 按如下樣本在AndroidManifest.xml檔案中聲明本地的activity
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.native_activity"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:label="@string/app_name" android:hasCode="false">
<activity android:name="android.app.NativeActivity"
android:label="@string/app_name"
android:configChanges="orientation|keyboardHidden">
<meta-data android:name="android.app.lib_name"
android:value="native-activity" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
主要的內容包括:
- activity標籤的android:name 屬性必須設成android.app.NativeActivity.
- meta-data標籤的android:name 屬性必須設成 android.app.lib_name, lib_name沒有模組的lib首碼和.so尾碼.
3/建立檔案實現ANativeActivity_onCreate()函數供activity啟動時調用。這個函數參數是ANativeActivity結構體指標,包含了指向回呼函數的函數指標,這些回呼函數需要編程實現,然後為ANativeActivity->callbacks賦值
4/ 為ANativeActivity->instance賦值為需要用到的資料地址
5/ 實現在activity啟動前需要做的其他事情
6/ 實現在ANativeActivity->callbacks中設定的其他回呼函數. 這些回呼函數的調用時機可以參看Activity的SDK文檔。需要注意的是這些實現不能阻塞,否則可能在運行時主線程會收到ANR(應用程式無響應)的錯誤。
7/ 開發應用程式功能
8/ 在jni目錄建立一個Android.mk檔案來描述本地代碼的編譯器選項,本質上這個檔案就是GNU Make檔案的一部分。例如:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := my_native_module
LOCAL_SRC_FILES := my_native_code.c
include $(BUILD_SHARED_LIBRARY)
怎樣建立和具體的含義參見<ndk_root>/docs/ANDROID-MK.TXT檔案。
9/ 一旦有了Android.mk檔案,就可以使用”ndk-build”命令編譯代碼了。
cd path/to/project
<ndk_root>/ndk-build
10/ 與常規應用一樣,使用Ant或Eclipse,會自動將jni目錄中的本地代碼打包到.apk檔案中。