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 |