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
②在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文件
新建 .c文件
选择对话框中的 .c/.h
完成后,可以把同一个文件名.h的文件删除,效果如下图:
将edan_com_as_ndk_demo_ndktest_NdkJniUtils.h中的方法复制到jnitest.c文件下,在改成如下效果即可。
#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,基本都能解决,当然,也可以留言,知道的必将言无不尽。
源码下载地址
推荐阅读
-
Android Studio 之 NDK篇
-
Android ndk 开发入门(01)之 Hello World
-
Android camera 篇之视频录制
-
Android之ndk编译出现"undefined reference to method"解决办法
-
Android Studio笔记之webview ——实现app本身打开网页而不跳转到其他浏览器(内置浏览器)
-
Android Studio 基础之获取Wifi 的状态,设置 Wifi 的开关状态,并监听 Wifi 的状态变化方法整理
-
使用android studio打jar包并且集成第三方开源库(修改补充篇)
-
Android NDK 环境搭建 之 起始篇NDK HelloWorld
-
Android开发小技巧篇之集合
-
Android开发小技巧篇之集合