MAC上android studio NDK親測可行

NDK基本介紹請參考以下鏈接:

http://www.cnblogs.com/devinzhang/archive/2012/02/29/2373729.html(NDK基本介紹)

http://blog.csdn.net/u010350809/article/details/46840893(NDK環境配置)

http://blog.csdn.net/yanbober/article/details/45309049(NDK搭建項目)

(文章中部分圖片出不來,右擊新標籤頁打開可見)

本文包括兩部分。

一,NDK環境配置

二,NDK項目運行。


一,NDK環境配置。

1,下載鏈接  https://dl.google.com/Android/ndk/android-ndk-r10d-darwin-x86_64.bin

2,下載完成之後,在cmd命令中解壓文件。

  (1) cd  命令進入下載後ndk存放的目錄  cd /Users/talon/Desktop/eclipse/androidStudio/NDK

  (2)執行解壓命令 ./android-ndk-r10d-darwin-x86_64.bin

 

  按下回車後,可以看到一直有信息在跑。

  看到下圖 代表解壓成功。


   

 解壓之後會看到一個文件夾。

  3, 使用命令指定 NDK 路徑  pico .bash_profile 

  (0), 輸入  pico .bash_profile   回車。

  (1). export PATH=$(PATH):/Users/talon/Desktop/eclipse/sdk/platform-tools 
  (2). export NDK_ROOT=/Users/talon/Desktop/eclipse/androidStudio/NDK/android-ndk-r10d
  (3). export PATH=$PATH:$NDK_ROOT
  最後保存( control+X) 選 Y 

  (4). 更新剛配置的環境變量輸入source .bash_profile  (如果沒有更新成功,嘗試重啓電腦)

 

4. 檢查是否配置成功。

 (1) 終端進入到 NDK下面的 samples 目錄下。

 (2) 輸入 cd hello-jni/  ,回車,然後執行 ndk-build

  出現以下界面代表配置成功。



二,NDK項目運行。 

1,新建一個Android Project,然後新建一個java類,命名爲:JniUtils

寫入以下方法:

public class JniUtils {
    public native String getString();
}

然後在MainActivity中調用這個方法。 將這個方法的返回值,顯示在界面上。然後build project

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        JniUtils jniUtils = new JniUtils();
        TextView tv = (TextView) findViewById(R.id.tv);
        tv.setText(jniUtils.getString());

    }
}

2,構建項目成功後。注意Test\app\build\intermediates\classes\debug 目錄。

然後接下來的步驟就是根據生成的class文件,利用javah生成對應的 .h頭文件。

點開AS的Terminal標籤,cd命令進入到該項目的app/build/intermediates/classes/debug/ 文件夾下。

然後執行命令:javah -jni com.android.talon.test.JniUtils 


然後查看文件夾 Test\app\build\intermediates\classes\debug 會生成一個.h文件:com_android_talon_JniUtils.h


3,在工程的main目錄下新建一個名字爲jni的目錄,然後將剛纔的 .h文件剪切過來。在jni目錄下新建一個c文件,隨意取名,我的叫jnitest.c 。然後編輯代碼如下

#include "com_android_talon_test_JniUtils.h"
/*
 * Class:     com_android_talon_test_JniUtils.h
 * Method:    getString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_android_talon_test_JniUtils_getString
        (JNIEnv *env, jobject obj){
    return (*env)->NewStringUTF(env,"Hello World!");
}

接下來在工程的local.properties文件中添加NDK路徑

sdk.dir=/Users/talon/Desktop/eclipse/androidStudio/sdk
ndk.dir=/Users/talon/Desktop/eclipse/androidStudio/NDK/android-ndk-r10d

接下來在app module目錄下的build.gradle中設置庫文件名(生成的so文件名)。找到gradle文件的defaultConfig這項,在裏面添加如下內容:

ndk{
    moduleName "JniLibName"         //生成的so名字
    abiFilters "armeabi", "armeabi-v7a", "x86"  //輸出指定三種abi體系結構下的so庫。
}
如圖:



4,生成的so文件也有了,那我們就要引用這個so文件。

在java 文件中。添加如下代碼。將 java文件中的方法與so文件中的代碼對應起來。

static {
    System.loadLibrary("JniLibName"); //和生成so文件的名字對應。
}
5,最後在項目的 gradle.properties 文件的末尾添加如下代碼:

   

android.useDeprecatedNdk=true

重新編譯項目並運行 ndk-build


so文件生成在哪裏。 請看以下截圖



Over!

如果無法生成.so,檢查是否創建了Android.mk和Application.mk文件

Android.mk

?
1
2
3
4
5
6
7
8
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
 
LOCAL_MODULE := JNIDemo
LOCAL_SRC_FILES := testJni.cpp
LOCAL_SRC_FILES += CAdd.cpp
 
include $(BUILD_SHARED_LIBRARY)

其中LOCAL_PATH是C/C++代碼所在目錄,也就是我們的jni目錄。
LOCAL_MODULE是要編譯的庫的名稱。編譯器會自動在前面加上lib,在後面加上.so。
LOCAL_SRC_FILES是要編譯的C/C++文件。

Application.mk

?
1
2
APP_ABI := all
#APP_ABI := armeabi armeabi-v7a x86 mips arm64-v8a mips64 x86_64

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