由于工作内容的关系,对于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方法

 

  ②点击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,基本都能解决,当然,也可以留言,知道的必将言无不尽。

  项目源码下载地址:源码下载

Android Studio 之 NDK篇的更多相关文章

  1. Android studio 使用NDK工具实现JNI编程

    前言: Android开发中常常会使用到第三方的.so库.在使用.so库的时候就要用到JNI编程.JNI是Java Native Interface的缩写.它提供了若干的API实现了Java和其它语言 ...

  2. 【Android Studio安装部署系列】二十五、Android studio使用NDK生成so文件和arr文件

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio使用ndk的简单步骤. NDK环境搭建 下载NDK 下载链接:https://developer.and ...

  3. Mac下Android studio 之NDK配置教程(一)

    Mac下Android studio 之NDK配置教程(一) 1.概述 近期项目全线转移到Mac下使用使用Android studio开发. 遇到关键代码封装到 ***native***层,此时在wi ...

  4. android studio使用ndk,jni随记

    1.下载ndk(会下载到sdk目录下) 2.配置 3.配置build.gradle(app) android { defaultConfig { ndk { moduleName "JniD ...

  5. Android Studio上NDK/JNI开发环境问题

    基础环境: 操作系统 —— Windows 7 Android Studio —— 1.5.1(android-studio-bundle-141.2456560-windows.exe) NDK — ...

  6. 【android 开 发 】 - Android studio 下 NDK Jni 开发 简单例子

    Android 开发了一段时间,一方面 ,感觉不留下点什么.有点对不起自己, 另一方面,好记性不如烂笔头,为了往后可以回头来看看,就当做是笔记,便决定开始写博客.废话不多说 ! 今天想搞一搞 ndk ...

  7. Android Studio增加NDK代码编译支持--Mac环境

    Android的APP开发基本都是使用Java或者跨平台框架进行开发的,对于很多APP来说已经足够了,但是,对于提供功能给外部使用或者性能要求很高的需求下,如图像处理等,可能会需要C/C++库的支持, ...

  8. Android Studio JNI/NDK 编程(二) Windows 下环境搭建 demo 开发

    环境 windows 8  (注:其实 Linux 开发可能更方便) Android Studio 2.1; 一 . 下载 安装android-ndk开发包 地址:链接:http://pan.baid ...

  9. Android Studio快捷键——编辑篇

    Android Studio是官方推出的Android开发IDE,本系列讲解Android Studio中常用的快捷键,本文是该系列的第一篇,讲解的内容是与编辑代码相关的快捷键. 本文所讲快捷键基于A ...

随机推荐

  1. CF868F Yet Another Minimization Problem

    题目描述: 给定一个序列,要把它分成k个子序列.每个子序列的费用是其中相同元素的对数.求所有子序列的费用之和的最小值. 输入格式:第一行输入n(序列长度)和k(需分子序列段数).下一行有n个数,序列的 ...

  2. Unique Binary Search Trees I&&II(II思路很棒)——动态规划(II没理解)

      Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For exa ...

  3. vue-vuex安装

    npm install vuex --save 然后在package.json文件的 dependencies中就看到有了一个vuex的文件 解释一下 dependencies生产环境它的意思就是上线 ...

  4. SPOJ - SUBST1 D - New Distinct Substrings

    D - New Distinct Substrings 题目大意:求一个字符串中不同子串的个数. 裸的后缀数组 #include<bits/stdc++.h> #define LL lon ...

  5. SpringBoot学习:读取yml和properties文件的内容

    一.在SpringBoot实现属性注入: 1).添加pom依赖jar包: <!-- 支持 @ConfigurationProperties 注解 --> <!-- https://m ...

  6. 洛谷——P2381 圆圆舞蹈

    P2381 圆圆舞蹈 题目描述 熊大妈的乃修在时针的带领下,围成了一个圆圈舞蹈,由于没有严格的教育,奶牛们之间的间隔不一致. 奶牛想知道两只最远的奶牛到底隔了多远.奶牛A到B的距离为A顺时针走和逆时针 ...

  7. POJ 3657 Haybale Guessing(区间染色 并查集)

    Haybale Guessing Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2384   Accepted: 645 D ...

  8. 【爬虫】python 多线程知识

    第一段代码: __author__ = 'Administrator' import threading import time index = 0 class MyThread(threading. ...

  9. noip 1999 回文数

    题目描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数. 又如:对于10进制数 ...

  10. Topcoder Srm 673 Div2 1000 BearPermutations2

    \(>Topcoder \space Srm \space 673 \space Div2 \space 1000 \space BearPermutations2<\) 题目大意 : 对 ...