Mac下安裝NDK,進行JNI開發

Android studio 集成NDK開發環境,只要設置ndk路徑。如果使用eclipse bundle開發,沒有NDK插件,需要導入jar包,和ADT插件一樣。如果下載JavaEE for mac 64位,需要安裝ADT插件才能開發android應用。下面介紹Mac下安裝如何NDK,進行JNI開發。

爲什麼用AS開發,還要Eclipse幫襯?

有些項目是eclipse的,用它來閱讀項目源碼或許有些必要,重要的是,我覺得它的NDK比Android Studio要成熟一些。所以還是要折騰下Eclipse NDK開發環境。
eclipse可以方便的爲項目添加本地支持,add Native Support,然後就可以識別c/c++代碼了,而且可以自定義編譯命令,確實比較方便。開發的時候最頭痛的就是一片紅。

一,Eclipse+NDK開發工具下載

1,Eclipse for Android &ADT bundle

鏈接: http://pan.baidu.com/s/1ge3pqs7 密碼: vbfw
裏面有mac和windows平臺的eclipse:adt-bundle-mac-x86_64-20140702

2,Eclipse的ndk插件和NDK for mac

鏈接: http://pan.baidu.com/s/1dF6XyVZ 密碼: x3jv
版本爲:android-ndk-r11b-mac-x86_64,ndk插件爲jar包。

二,安裝NDK,配置NDK路徑和環境變量

1,安裝NDK for mac

找到ndk的安裝包位置,進入該路徑,然後提升操作權限,用./解壓。例如:

cd /Users/duqian/android-ndk
chmod a+x android-ndk-r10c-darwin-x86_64.bin
./android-ndk-r10c-darwin-x86_64.bin

2,配置ndk路徑

Android studio 設置ndk路徑,File>Project Structure>SDK Location 設置SDK,JDK,NDK路徑即可。
eclipse解壓出來就可以使用,在首選項裏面,設置ndk路徑。如果沒有ndk的插件選項,就把ndk插的jar包,直接放到eclipse根目錄的plugins目錄下面。重啓eclipse生效。然後重新設置。

需要注意的是,添加本地支持後,如果ndk路徑改變,那麼原來jni目錄中,很多頭文件就找不到了,因爲Eclipse記住了這些文件的路徑。可以刪除eclipse隱藏文件裏面的一些內容,最好是刪除重新導入一次項目,或者重新構建。

3,添加ndk環境變量

請看我的另一文章: mac下配置JDK,SDK,NDK和ADB環境

三,終端使用ndk命令

1.生成頭文件.h

cd到項目的path/to/project/src目錄下使用javah命令。

cd /Users/duqian/AndroidMac/eclipse2016/HelloJNI/src
javah -jni com.example.hellojni.MainActivity

在項目project/bin/classes目錄下使用javah命令,容易出錯!

DuQian-MBP:classes duqian$ javah -jni com.example.hellojni.MainActivity
錯誤: 無法訪問android.app.Activity
  找不到android.app.Activity的類文件

不要傻傻的自己寫頭文件,低效又容易出錯。

2.ndk-build

ndk-build命令可以編譯jni目錄中的文件爲.so庫文件。然後就可以給android調用了。

cd /Users/duqian/AndroidMac/eclipse2016/HelloJNI/jni
ndk-build

四,JNI開發,NDK項目實戰

也可以看我的另一文章:Android JNI技術, NDK開發

1,jni目錄寫c代碼,這裏不使用生成的頭文件,直接寫。返回字符串給andoird調用:

#include <string.h>
#include <jni.h>
jstring Java_com_example_hellojni_MainActivity_stringFromJNI(JNIEnv* env, jobject thiz)
{
    return (*env)->NewStringUTF(env, "Hello from JNI!");
}

2,Android.mk配置文件

eclipse中在項目中add Native Support後,jni目錄自動生成,其中就有這個文件。簡單配置下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := hello-ndk
LOCAL_SRC_FILES := hello-ndk.c
include $(BUILD_SHARED_LIBRARY)

3,android調用c代碼:

public class MainActivity extends Activity {
    // 聲明本地方法,位於hello-ndk.c  
    public native String stringFromJNI();  
    static {  
        System.loadLibrary("hello-ndk");  //導入編譯後的.so庫
    }  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
        TextView tv = new TextView(this);  
        tv.setText(stringFromJNI());  //android 調用c語言返回的字符串
        setContentView(tv);  
    }  
}

4,Application.mk文件

常用的是APP_ABI,交叉編譯爲對應平臺的.so庫文件。

#註釋NDK的編譯系統根據 "armeabi" ABI生成機器代碼。
APP_ABI := armeabi

比如:爲了在ARMv7的設備上支持硬件FPU指令。可以使用 APP_ABI := armeabi-v7a
如果是x86,則:

APP_ABI := x86

Application.mk文件目的是描述在你的應用程序中所需要的模塊(即靜態庫或動態庫)。
Application.mk文件通常被放置在 PROJECT/jni/Application.mk PROJECT指的是您的項目。

五,NDK開發注意事項

Android.mk文件是GNU Makefile的一小部分,用來對Android程序進行編譯。 因爲所有的編譯文件都在同一個 GNU MAKE 執行環境中進行執行,而Android.mk中所有的變量都是全局的。因此,您應儘量少聲明變量,不要認爲某些變量在解析過程中不會被定義。
Java代碼中使用native關鍵字標示方法是JNI庫中的函數,編譯出來的JNI庫的名字是會加上lib,按照規範,System.loadLibrary中的參數是去掉lib和.so的。

未完待續,杜工,Dusan,Q291902259Mac下安裝NDK,進行JNI開發

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章