Android Studio 之 NDK篇

幼敏悟过人,读书辄成诵。这篇文章主要讲述Android Studio 之 NDK篇相关的知识,希望能为你提供帮助。
由于工作内容的关系,对于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下载,也可以通过这个链接下载:下载地址,至于版本的话,根据自己电脑系统自行选择最新版本,
如果访问不了,需要使用FQ的话,可以下载天行VPN(有试用版,一天一个小时,关键是不要钱还能FQ),FQ工具下载链接:VPN工具下载
第二步:新建一个Project,完成NDK的配置
①在工程的local.properties里面添加NDK的路径代码:

ndk.dir=C\\:\\\\android-ndk-r10e

Android Studio 之 NDK篇

文章图片

②在gradle.properties里面声明使用NDK的代码
android.useDeprecatedNdk=true

Android Studio 之 NDK篇

文章图片

③在app的build.gradle里面,添加NDK的编译信息(包括生成的so库名字,以及编译出来的各种平台版本)
Android Studio 之 NDK篇

文章图片
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\' }

Android Studio 之 NDK篇

文章图片
Android Studio 之 NDK篇

文章图片

第三步:编辑native方法,生成.h头文件
①编辑native方法
Android Studio 之 NDK篇

文章图片
  View Code②点击Build--> Make Project,生成class文件
【Android Studio 之 NDK篇】③找到class文件,在app-> build-> intermediates-> classes-> debug目录下:
Android Studio 之 NDK篇

文章图片

④通过javah命令生成.h头文件,点击Android Studio底下菜单中的Terminal
依次敲入:
cd app\\build\\intermediates\\classes\\debug

javah -jni edan.com.as_ndk_demo.ndktest.NdkJniUtils

使用javah的时候,具体的包名按照实际情况来书写
Android Studio 之 NDK篇

文章图片

没有什么错误的话,可以在debug目录下看到.h的头文件

Android Studio 之 NDK篇

文章图片
/* 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

Android Studio 之 NDK篇

文章图片
Android Studio 之 NDK篇

文章图片

第四步:根据生成.h头文件,以及新建的.c或者.cpp文件,生成.so库文件
①在app-> src-> main目录下新建一个jni文件夹,用来存c/c++的头文件以及源文件,将刚刚生成.h头文件剪切到这里来,然后新建一个.c或者.cpp文件
Android Studio 之 NDK篇

文章图片

Android Studio 之 NDK篇

文章图片
#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!"); }

Android Studio 之 NDK篇

文章图片
②点击Build-> Make Project进行编译,生成.so库文件,路径:app-> build-> intermediates-> ndk-> debug-> lib下:
Android Studio 之 NDK篇

文章图片

③拷贝lib下的这些文件夹,到app-> libs下:
Android Studio 之 NDK篇

文章图片

第五步:通过MainActivity的TextView显示C里面的内容:

Android Studio 之 NDK篇

文章图片
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篇

文章图片
 
至此,Android Studio 的NDK的基础篇讲述完了,期间遇到任何问题或者错误,将错误信息copy去google,基本都能解决,当然,也可以留言,知道的必将言无不尽。
项目源码下载地址:源码下载

    推荐阅读