2014年5月17日 星期六

手動ndk-build

在Android Studio裡,有了gradle的幫助我們不需要自己去撰寫Android.mk,它自動就會幫你產生Android.mk,build成.so檔就可以引用,但是當一個大程式要這麼做的時候就會產生問題,因為複雜,所以你會需要自己編寫Android.mk,這個時候就會產生問題,現在我們就來看看要怎麼樣自己撰寫Android.mk和ndk-build。

目的

自己撰寫Android.mk和ndk-build來寫一個Hello JNI。

前置處理

MainActivity.java中的寫法跟第一個Android NDK(Java call C)中相同,先把它寫上去。

步驟

1. javah

上一篇有講,這裡就不再多說了,只是這裡的classpath要改一下,如下所示 : 


2. main

這裡跟上一篇相同。

3. Android.mk

在ndk/doc中,我們可以找到ANDROID-MK.html中的說明,以下是我寫的 : 


4. 關掉自動ndk-build

因為我們不想要讓gradle自動去build ndk,所以我們要把它關掉,在build.gradle的android中打上下面的指令 :



5. ndk-build

接著開Terminal,目錄移到jni,鍵入ndk-build(記得要設定環境參數)


6. 移動檔案

將生成出來的libs中的armeabi資料夾整個移到build/ndk/debug/lib中,就可以運行了

參考資料

2014年5月15日 星期四

第一個Android NDK(Java call C)

最近因為要在Android中使用到C Library,查了一下發現NDK這個工具,它讓Java可以去呼叫C,讓我們在Android的專案中也可以使用C Library。

環境

  • Windows 8.1(64bits)
  • Android Studio 0.58
  • Android NDK Revision 9d
  • ASUS Nexus 7-Android 4.4.2(API 19)

目的

我們要利用Java去呼叫C的方法,然後將取到的字串輸出。

步驟

1. 下載NDK

https://developer.android.com/tools/sdk/ndk/index.html下載符合自己系統的NDK,這裡我們下載Windows 64-bit的NDK,目前的版本是9d。
載好之後隨便放一個地方,記得路徑以便等下使用(我的路徑為C:\Android\android-ndk-r9d)。

2. 新增native宣告C的方法

在MainActivity.java中打入上面的程式碼,宣告完native function之後要先build,要不然等下的javah會找不到這個方法導致遺漏。

3. 使用javah

先簡單講解javah的使用方式,它可以幫我們產生C header file以便讓我們可以在.java中找到對應的方法。

開啟Terminal

Tools > Open Terminal

將所在目錄轉到main

鍵入javah的指令產生.h


  • -d directory(你要儲存的目錄)
  • -classpath path(javah需要的classes(SDK及project的class路徑))
PS:如果找不到javah的話會產生下面的錯誤
在環境變數裡加上javah的路徑就可解決

4. 加入main.c

如果上面的native有被build的話,你的.h中應該會有{your package}_{native function}(我的就是Java_com_hpchen_testndk_app_MainActivity_getStringFromNative)。
PS:如果沒有請clean project,刪掉jni資料夾,rebuild之後再把第3步重做一次。

  • 記得include .h
  • 將.h中的native function寫好

5. 加入util.c

加入一個空的util.c

6. local.properties中加入ndk路徑


將第1步記下的路徑加入local.properties

7. build.gradle中加入ndk參考


注意:是app中的build.gradle,不是project的。

8. 在MainActivity中load library


執行之後就會看到"Hello JNI !"了。

參考