android JNI入門-學習筆記

來源:互聯網
上載者:User

標籤:android   android開發   

JNI入門-學習筆記
可執行檔  Windows - *.exe | linux - *.elfc函數庫檔案 Windows - *.dll | linux - *.so批次檔  Windows - *.bat | linux - *.sh
工具

NDK -- native developer kits

Cygwin -- Linux系統模擬器

  • 安裝過程要點: ——安裝時可以連網安裝也可以通過本地檔案安裝(如果有本地檔案) ——Select Packages:沒必要全部安裝,安裝Devel和Shells這兩個即可 ——安裝好後雙擊案頭快捷表徵圖進入Cygwin命令控制台 指令:cd.. | cd.. | ls | cd cygdrive
  • 為了方便在任何目錄執行指令ndk-build,需要環境變數的配置: 來到Cygwin的安裝目錄 ../cygwin/etc/profile,開啟profile檔案,修改PATH的值,多個環境變數之間用冒號(:)分隔。例如這樣:PATH="...:/cygdrive/c/android-ndk-r7b:...", 如果不成功,也可以配置Windows下的系統內容變數使用cmd運行

CDT -- 為了方便在eclipse開發c代碼 讓c代碼高亮顯示

  • 全稱: CDT:c/c++ developer tools ADT:android developer tools
  • 安裝步驟: eclipse --> help --> install new software --> add --> Name:cdt|Location:adt.zip --> next。 這時有兩個外掛程式供選擇CDT Main Features和CDT Optional Features,只選擇前者即可,Contact all update sites...這個選項是連網更新,可以不選,next,安裝好後eclipse中會有個C/C++的視圖
JNI開發之HelloWorld

第一步: 建立一個Android工程,定義一個本地方法

public class MainActivity extends Activity {    // 定義一個本地方法,相當於c的介面,需要用c代碼對這個方法做實現    public native String helloFromC();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }    ...}

第二步: 在工程下建立一個檔案夾叫jni,必須是這個檔案名稱,然後再該檔案夾下建立一個檔案,比如叫Hello.c,在Hello.c檔案中編寫C代碼,這個方法名比較長,快捷產生方式:cmd--cd到工程src目錄下,輸入命令javah com.example.helloworldformc.MainActivity(全類名),會在src目錄下回產生一個.h的標頭檔,將此檔案拷貝到jni目錄下,開啟該檔案複製裡面的方法去掉分號加上{}即可

#include <stdio.h>#include <jni.h>// Java+全類名+方法名,用_串連每個單詞jstring Java_com_example_helloworldformc_MainActivity_helloFromC(JNIEnv* env,jObject obj){    return (*env)->NewStringUTF(env,"hellofromc");}

第三步: 在jni檔案夾下建立Android.mk檔案

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)# 對應打包成函數庫的名字,你想打包成什麼檔案名稱,這裡就寫成什麼,LOCAL_MODULE    := hello# 對應C代碼的檔案名稱LOCAL_SRC_FILES := Hello.cinclude $(BUILD_SHARED_LIBRARY)

第四步:

把C代碼打包成函數庫:cmd--> cd到Android工程所在目錄 --> ndk-build(交叉編譯命令),重新整理下工程,在libs/armeabi中就會有一個.so檔案,檔案名稱是lib+hello(mk中定義的庫名),並且工程中會多出來一個obj的檔案夾,主要存放的是中間檔案

第五步: 在Java代碼中引入函數庫

// 使用靜態代碼塊在Java代碼中引入函數庫static{    System.loadLibrary("hello"); }

第六步:

public void method(){    // 調用    String str = helloFromC();    Toast.makeText(getApplicationContext(), str, 1).show();}

** 注意 **

  • 引用別人的.so函數庫時,需要你自己native方法對應類的包名 和之前他人打包成.so函數庫時的包名一致
  • 如果需要在C語言中列印日誌,需要引入標頭檔

    eg:#include <android/log.h>

    但是log的方法名太長不好記,我們需要做下處理

    eg: #define LOGTAG "clog" #define LOGD(...) androidlogprint(ANDROIDLOGDEBUG, LOGTAG, __VAARGS) #define LOGI(...)androidlogprint(ANDROIDLOGINFO, LOGTAG, _VAARGS)

    另外在mk檔案中加上一句:LOCAL_LDLIBS += -llog

    在C代碼中類似這樣調用:LOGD("x = %d",x);

C調用Java

原理:C通過反射的方法調用Java的方法 C中有類似擷取class對象,擷取methodId,調用五返回值方法CallVoidMethod等等方法 上述方法可以到標頭檔jni.h中去找, jni.h所在目錄:android-ndk-r7b\platforms\android-8\arch-arm\usr\include 通過這些方法可以實現C代碼調用Java代碼 擷取方法簽名:cd到bin目錄下的classes檔案夾下,javap -s 方法所在類的全類名

C
標頭檔 *.h庫檔案 *.so/*.o兩者關係的比喻:標頭檔相當於Java中的介面檔案,庫檔案相當於Java中的實作類別檔案工具下載:http://pan.baidu.com/s/1mg2zvN6

其他精彩文章

android學習筆記(41)android選項菜單和子功能表(SubMenu )android學習筆記(40)Notification的功能與用法android學習筆記(42)android使用監聽器來監聽菜單事件android學習筆記(43)android建立單選菜單和複選菜單android學習筆記(44)android設定與功能表項目關聯的Activityandroid學習筆記(45)android操作功能表 jQuery教程(12)-ajax操作之基於請求載入資料 jQuery教程(13)-ajax操作之追加 HTML

更多關於android開發文章


android JNI入門-學習筆記

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.