歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android+NDK 入門備忘 Ubuntu 11.10

Android+NDK 入門備忘 Ubuntu 11.10

日期:2017/3/1 10:15:44   编辑:Linux編程

開始使用 Android NDK 進行開發,NDK 的主要原理還是 JNI 技術,這一技術實現了 Java代碼和 C/C++代碼間的相互調用,這樣做的好處是:首先,將一些比較耗時的操作放到底層來實現,畢竟C和C++的效率高比Java高,並且指針是可以加快程序的運行速度;其次. 在C語言領域,已經有很多成熟的類庫和框架,使用NDK後,可以直接使用他們,因而避免再用Java去重復制造輪子。

Android NDK的開發,需要Linux的編譯環境,所以建議直接裝個Linux系統,在上面進行Android開發,當然也可以使用虛擬機來代替,不過個人覺得虛擬機始終不倫不類,還是真正的Linux環境比較順手。

使用NDK時的大致步驟如下:

1. 新建一個Android 工程,在裡面新建一個jni 文件夾,專門用來存放 C 語言程序和Android.mk 文件;

2. 在java文件中編寫一個 native 函數:

  1. package tangyuchun.ndk.hellojni;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.widget.TextView;
  5. public class HellojniActivity extends Activity {
  6. static {
  7. System.loadLibrary("hello-jni");
  8. }
  9. public void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. TextView tv = new TextView(this);
  12. tv.setText(getString());// 調用了native方法
  13. setContentView(tv);
  14. }
  15. public native static String getString();
  16. }

這裡是一個簡單的Activity界面,裡面定義了一個 getString()方法,用來獲取一個字符串。

3. 打開終端,使用 javah -classpath 命令編譯 bin/classes 下生成的 .class文件。我的命令如下:

javah -classpath /home/administrator/android_code/hello-jni/bin/classes tangyuchun.ndk.hellojni.HellojniActivity

也可以在src的 .java 源代碼中使用同樣的命令:

javah -classpath /home/administrator/android_code/hello-jni/src tangyuchun.ndk.hellojni.HellojniActivity

記得在前面要加上包名(我的是在tangyuchun.ndk.hellojni 這個包下面)。

4. 經過第3步後,就會在該類目錄下生成一個 .h 的頭文件(Ubuntu也有可能生成在主文件夾下面),名字為

tangyuchun_ndk_hellojni_HellojniActivity.h,打開這個頭文件,內容如下:

  1. #include <jni.h>
  2. /* Header for class tangyuchun_ndk_hellojni_HellojniActivity */
  3. #ifndef _Included_tangyuchun_ndk_hellojni_HellojniActivity
  4. #define _Included_tangyuchun_ndk_hellojni_HellojniActivity
  5. #ifdef __cplusplus
  6. extern "C" {
  7. #endif
  8. /*
  9. * Class: tangyuchun_ndk_hellojni_HellojniActivity
  10. * Method: getString
  11. * Signature: ()Ljava/lang/String;
  12. */
  13. JNIEXPORT jstring JNICALL Java_tangyuchun_ndk_hellojni_HellojniActivity_getString
  14. (JNIEnv *, jclass);
  15. #ifdef __cplusplus
  16. }
  17. #endif
  18. #endif

5. 看到裡面有一個函數: JNIEXPORT jstring JNICALL Java_tangyuchun_ndk_hellojni_HellojniActivity_getString(JNIEnv *, jclass);

這個方法就與第2步的getString()對應。

6. 在jni 文件夾中新建一個 c語言文件,我的是 hello-jni.c ,include相應的頭文件,然後將第4步中的那個方法復制,完成該方法:

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <android/log.h>
  4. #include <stdlib.h>
  5. #include <jni.h>
  6. JNIEXPORT jstring JNICALL Java_tangyuchun_ndk_hellojni_HellojniActivity_getString(
  7. JNIEnv *env, jclass thiz) {
  8. return (*env)->NewStringUTF(env, "Some say love");
  9. //這裡只是做個樣例,所以只讓他返回一段字符串 "Some say love"
  10. }

注意,要給方法添加參數,頭文件中只是聲明,並沒有實參。

7. 同樣,在 jni 文件夾下面新建一個 Android.mk 文件,內容如下:

  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE := hello-jni
  4. LOCAL_SRC_FILES := hello-jni.c
  5. include $(BUILD_SHARED_LIBRARY)

那個LOCAL_MODULE 就是將要生成的.so 文件名,LOCAL_SRC_FILES就是第6步中編寫的 .c 文件。

8. 保存上述文件,打開終端,定位到工程的目錄下的jni 文件夾,在終端輸入: ndk-build 命令,回車。

9. 返回到工程文件夾下,就會看到生成了兩個文件夾 libs 和 obj,其中 libs/armeabi/ 文件夾下面就有 一個libhello-jni.so文件,這

個.so文件其實就是用來在android中調用C語言的類庫;

10. 在Android虛擬機上運行上面建立的工程,如下所示:

Copyright © Linux教程網 All Rights Reserved