Eclipse編譯運行Native代碼步驟詳解

轉載自:http://blog.csdn.net/mylzc/article/details/8740523html

最近一段時間在作native層的開發,把一些經驗和技巧記錄下來,但願對你們有幫助。本教程以step-by-step的形式給正處入門階段的native開發新手提供指引。java


導言:在進行Android開發的過程當中,在一些對性能要求較高的場景,例如圖像處理,視音頻編解碼等,須要使用到native代碼以提升運行效率。本教程將在native層進行加法運算和字符串鏈接,經過這個簡單的例子闡述使用eclipse編譯運行ndk代碼的過程。android

注:JNI基礎知識不在本文的討論範圍以內,推薦瀏覽oracle的幫助文檔進行系統學習git


開發環境:github

Adt-bundle(ver:21.1.0) 下載地址:https://developer.android.com/sdk/index.htmloracle

Ndk(ver:r8b) 下載地址:https://developer.android.com/tools/sdk/ndk/index.htmleclipse

示例工程下載地址:https://github.com/ilzc/Code/tree/master/jniide


步驟詳解:函數

一、  配置ndk路徑性能

打開Eclipse後,點擊菜單欄的Project->Preferences打開Preferences窗口,點擊左側Android->NDK選項,在右側NDK Location填入ndk的路徑



二、  建立工程並增長native支持

點擊菜單欄的File->New->Android Application Project建立Android工程。


建立完畢後,在PackageExplorer中右鍵點擊剛纔新建的Android項目,選擇Android Tools->Add Native Support,按下圖填寫,點擊確認後,工程目錄下會增長jni目錄,jni目錄下有test.cpp和Android.mk。





三、  編寫jave層的jni接口

建立一個Java類,類名爲Jni

編寫加載庫的代碼,並添加兩個native方法

 

[java] view plain copy
  1. package com.mylzc.jni;  
  2.   
  3. public class Jni {  
  4.     static {  
  5.         System.loadLibrary("test");//加載庫 libtest.so  
  6.     }  
  7.     public static native int plus(int a, int b);//對應native層的Java_com_mylzc_jni_Jni_plus函數  
  8.     public static native String getString(String a, String b);//對應native層的Java_com_mylzc_jni_Jni_getString函數  
  9. }  

 


四、  編寫native層的代碼

 

  1. #include <jni.h>  
  2. #include "stdlib.h"  
  3.   
  4. extern "C" {  
  5. jint Java_com_mylzc_jni_Jni_plus  
  6.   (JNIEnv *, jclass, jint x, jint y) {  
  7.     return x + y;//返回x+y的結果  
  8. }  
  9.   
  10. jstring Java_com_mylzc_jni_Jni_getString  
  11.   (JNIEnv *env, jclass, jstring a, jstring b) {  
  12.   
  13.     const char* str_a = env->GetStringUTFChars(a, 0);  
  14.     const char* str_b = env->GetStringUTFChars(b, 0);  
  15.   
  16.     int len_a = strlen(str_a);  
  17.     int len_b = strlen(str_b);  
  18.   
  19.     //concat string  
  20.     char* str_result = new char[len_a+len_b +1];  
  21.     strcpy(str_result, str_a);  
  22.     strcat(str_result,str_b);  
  23.     jstring jstr_result = env->NewStringUTF(str_result);//建立string對象  
  24.     delete[] str_result;  
  25.   
  26.     env->ReleaseStringUTFChars(a, str_a);  
  27.     env->ReleaseStringUTFChars(b, str_b);  
  28.   
  29.     return jstr_result;//返回ab字符串鏈接以後的結果  
  30. }  
  31. }  

 


五、  編寫Android.mk

[html] view plain copy
  1. LOCAL_PATH := $(call my-dir)  #指定源文件目錄  
  2.   
  3. include $(CLEAR_VARS) #清空變量  
  4.   
  5. LOCAL_MODULE    :test  #模塊名稱,對應編譯出libtest.so  
  6. LOCAL_SRC_FILES :test.cpp #指定要編譯的源文件  
  7.   
  8. include $(BUILD_SHARED_LIBRARY) #指定編譯動態連接庫  



六、  編譯運行

編譯:在Package Explorer視窗,右鍵點擊jni項目,選擇Build Project編譯項目,編譯成功後,在工程libs->armeabi目錄下能夠看到libtest.so。


運行:在Package Explorer視窗,右鍵點擊jni項目,選擇Run As->Android Application運行工程。

最後,咱們能夠在logcat中能夠看到打印結果:

相關文章
相關標籤/搜索