Android技術2:NDK開發之Helloworld
我們都知道在Android中編寫應用程式的主要代碼使用Java,然後Java自身某些不足,如Java代碼都運行在虛擬機器上面,處理速度相對C/C++來說比較慢,但是隨便近年來即時編譯器,虛擬機器技術的發展,Java處理速度有很大的發展。還有在遊戲視頻處理方法,需要短時間內大量的計算,這個Java無法做到;C語言發展以來有了很多開源的庫,供大家使用,但如果應用到android中,為了避免再重新用Java改寫的麻煩,Android推出了NDK技術,它能將C語言編譯成Linux下可以啟動並執行二進位檔案(.so)。
對於環境的搭配具體不在介紹,可以參考其他部落格文章,已經講得非常詳細了。
1.開發工具
首先簡單的介紹下開發的工具,在準備學習NDK技術時,必然之前一些Android方法的基本已經大致瞭解,當然已經搭配JDK,Eclipse,ADT等工具。如果準備學習NDK還需要下載NDK,下載安裝Cygwin(類比Linux環境用的),下載CDTEclipse C/C++開發外掛程式)。
2.NDK之Helloworld的步驟介紹
2.1建立android項目
這裡我使用項目名:AndroidNDK
包名:com.forsta.ndk; (這裡包名需要注意跟後面的c語言函數名相關)
2.2在工程目錄下,建立目錄檔案夾-jni,在這裡添加c語言代碼和Andorid.mk
2.3在Java代碼中添加native方法
我在MainActivity中添加 public native String FromCString();
2.4添加c語言代碼
由於C語言代碼函數名與包名,類名,方法名相關,書寫不變,可以利用javah工具實現
可以先建立MainActivty.java檔案
- package com.forsta.ndk;
- class MainActivity{
- public native String FromCString();
- }
-
- 通過javac MainActivity.java編譯,獲得MainActivity.class
-
- 然後通過javah MainActivity
-
- 得到com_forsta_ndk_MainActivity.h
-
- 代碼如下
-
- /* DO NOT EDIT THIS FILE - it is machine generated */
- #include <jni.h>
- /* Header for class com_forsta_ndk_MainActivity */
-
- #ifndef _Included_com_forsta_ndk_MainActivity
- #define _Included_com_forsta_ndk_MainActivity
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*
- * Class: com_forsta_ndk_MainActivity
- * Method: FromCString
- * Signature: ()Ljava/lang/String;
- */
- JNIEXPORT jstring JNICALL Java_com_forsta_ndk_MainActivity_FromCString
- (JNIEnv *, jobject);
-
- #ifdef __cplusplus
- }
- #endif
- #endif
-
- 上麵灰色背景即為函數名
-
- 可以幫.h標頭檔放到jni目錄下,然後建立Hello.c
-
- #include <stdio.h>
- #include <jni.h>
- #include "com_forsta_ndk_MainActivity.h"
-
- /*
- * Class: com_forsta_ndk_MainActivity
- * Method: FromCString
- * Signature: ()Ljava/lang/String;
- */
- JNIEXPORT jstring JNICALL Java_com_forsta_ndk_MainActivity_FromCString
- (JNIEnv *env, jobject obj){
-
- return (*env)->NewStringUTF(env,"Hello,I am Forsta from C lib!");
-
- }
2.5添加Android.mk
下面是最簡單的mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.c
include $(BUILD_SHARED_LIBRARY)
2.6cygwin下編譯c語言檔案
2.6.1Cygwin移動到項目工程目錄下
2.6.2使用ndk-build編譯
2.6.3重新整理工程
得到obj ,lib目錄
2.7運行android程式
2.8點擊Button效果
本文連結:http://www.cnblogs.com/forsta/archive/2014/07/30/3878044.html