由於工作內容的關系,對於NDK的工作涉及比較廣(保密性,安全性),所以本章內容講述一下NDK的基本使用過程。
網上也有很多這樣的教程或者描述,但描述的並不完全
開發工具:Android Studio 2.1.2
NDK版本:android-ndk-r10e,支持64位so庫的編譯
JDK版本:1.8 64位
使用步驟如下:
第一步:NDK環境的搭建
①jdk,Android SDK這些准備充分(只要能正常使用Android Studio的,這一條基本不用考慮)
②下載NDK,可以通過Android Studio的SDK Manager下載,也可以通過這個鏈接下載:下載地址,至於版本的話,根據自己電腦系統自行選擇最新版本,
如果訪問不了,需要使用翻牆的話,可以下載天行VPN(有試用版,一天一個小時,關鍵是不要錢還能翻牆),翻牆工具下載鏈接:VPN工具下載
第二步:新建一個Project,完成NDK的配置
①在工程的local.properties里面添加NDK的路徑代碼:
ndk.dir=C\:\\android-ndk-r10e
②在gradle.properties里面聲明使用NDK的代碼
android.useDeprecatedNdk=true
③在app的build.gradle里面,添加NDK的編譯信息(包括生成的so庫名字,以及編譯出來的各種平台版本)
apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "24.0.0" defaultConfig { applicationId "edan.com.as_ndk_demo" minSdkVersion 11 targetSdkVersion 23 versionCode 1 versionName "1.0" ndk{ moduleName "MyTestJniLib" //生成的.so的名字 abiFilters "armeabi","armeabi-v7a","x86" } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } sourceSets { main { jniLibs.srcDirs = ['libs'] } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.4.0' }
第三步:編輯native方法,生成.h頭文件
①編輯native方法

package edan.com.as_ndk_demo.ndktest; /** * Created by ouyangshengduo on 2016/9/23. */ public class NdkJniUtils { static { System.loadLibrary("MyTestJniLib"); //defaultConfig.ndk.moduleName } public native String getCLanguageString(); }
②點擊Build-->Make Project,生成class文件
③找到class文件,在app->build->intermediates->classes->debug目錄下:
④通過javah命令生成.h頭文件,點擊Android Studio底下菜單中的Terminal
依次敲入:
cd app\build\intermediates\classes\debug
javah -jni edan.com.as_ndk_demo.ndktest.NdkJniUtils
使用javah的時候,具體的包名按照實際情況來書寫
沒有什么錯誤的話,可以在debug目錄下看到.h的頭文件
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class edan_com_as_ndk_demo_ndktest_NdkJniUtils */ #ifndef _Included_edan_com_as_ndk_demo_ndktest_NdkJniUtils #define _Included_edan_com_as_ndk_demo_ndktest_NdkJniUtils #ifdef __cplusplus extern "C" { #endif /* * Class: edan_com_as_ndk_demo_ndktest_NdkJniUtils * Method: getCLanguageString * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_edan_com_as_1ndk_1demo_ndktest_NdkJniUtils_getCLanguageString (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
第四步:根據生成.h頭文件,以及新建的.c或者.cpp文件,生成.so庫文件
①在app->src->main目錄下新建一個jni文件夾,用來存c/c++的頭文件以及源文件,將剛剛生成.h頭文件剪切到這里來,然后新建一個.c或者.cpp文件
#include "edan_com_as_ndk_demo_ndktest_NdkJniUtils.h" /* * Class: com_example_edu_ndktest_NdkJniUtils * Method: getCLanguageString * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_edan_com_as_1ndk_1demo_ndktest_NdkJniUtils_getCLanguageString (JNIEnv *env, jobject obj){ return (*env)->NewStringUTF(env,"My name is Ouyangshengduo,Hi!"); }
②點擊Build->Make Project進行編譯,生成.so庫文件,路徑:app->build->intermediates->ndk->debug->lib下:
③拷貝lib下的這些文件夾,到app->libs下:
第五步:通過MainActivity的TextView顯示C里面的內容:
package edan.com.as_ndk_demo; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.TextView; import edan.com.as_ndk_demo.ndktest.NdkJniUtils; public class MainActivity extends AppCompatActivity { private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = (TextView) findViewById(R.id.text); NdkJniUtils ndk_util = new NdkJniUtils(); mTextView.setText(ndk_util.getCLanguageString()); } }
至此,Android Studio 的NDK的基礎篇講述完了,期間遇到任何問題或者錯誤,將錯誤信息copy去google,基本都能解決,當然,也可以留言,知道的必將言無不盡。
項目源碼下載地址:源碼下載