博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Studio 之 NDK篇
阅读量:4309 次
发布时间:2019-06-06

本文共 3745 字,大约阅读时间需要 12 分钟。

由于工作内容的关系,对于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工具下载链接:

  第二步:新建一个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方法

 
View Code

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

  项目源码下载地址:

转载于:https://www.cnblogs.com/fnlingnzb-learner/p/7207468.html

你可能感兴趣的文章
influxdb 命令行输出时间为 yyyy-MM-dd HH:mm:ss(年月日时分秒)的方法
查看>>
已知子网掩码,确定ip地址范围
查看>>
判断时间或者数字是否连续
查看>>
docker-daemon.json各配置详解
查看>>
Docker(一)使用阿里云容器镜像服务
查看>>
Docker(三) 构建镜像
查看>>
FFmpeg 是如何实现多态的?
查看>>
FFmpeg 源码分析 - avcodec_send_packet 和 avcodec_receive_frame
查看>>
FFmpeg 新旧版本编码 API 的区别
查看>>
RecyclerView 源码深入解析——绘制流程、缓存机制、动画等
查看>>
Android 面试题整理总结(一)Java 基础
查看>>
Android 面试题整理总结(二)Java 集合
查看>>
学习笔记_vnpy实战培训day02
查看>>
学习笔记_vnpy实战培训day03
查看>>
VNPY- VnTrader基本使用
查看>>
VNPY - CTA策略模块策略开发
查看>>
VNPY - 事件引擎
查看>>
MongoDB基本语法和操作入门
查看>>
学习笔记_vnpy实战培训day04_作业
查看>>
OCO订单(委托)
查看>>