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 23buildToolsVersion "24.0.0"defaultConfig {applicationId "edan.com.as_ndk_demo"minSdkVersion 11targetSdkVersion 23versionCode 1versionName "1.0"ndk{moduleName "MyTestJniLib" //生成的.so的名字abiFilters "armeabi","armeabi-v7a","x86"}}buildTypes {release {minifyEnabled falseproguardFiles 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 <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;@Overrideprotected 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/268871.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

避免一个用户多次登录修改版

原来的代码参见这里http://www.qiuhao.com//dispbbs.asp?boardID2&ID6228&page1 今天仔细看了这段代码,发现这段代码大有优化的余地 因为maxSessions 这个值可能会很大,我这里测试环境有3万多个,启动时要浪费半分钟左右 另外sessionId是个随机数,用1到maxSessions其实…

Maven工程 报 Diamond types are not supported at language level ‘5‘

选择file project Structure 1.Project – Project language level 选择8 2. Modules – Language level&#xff1a; 选择8

Ubuntu 16.04安装idea

此篇为http://www.cnblogs.com/EasonJim/p/7139275.html的分支页。 前提&#xff1a;必须正确安装JDK和Tomcat。 下载&#xff1a; https://www.jetbrains.com/idea/download/previous.html 这里可以下载社区版本&#xff0c;也可以下载以往历史版本。 安装过程&#xff1a; 解…

深表歉意

近期有许多读者朋友向我反应&#xff0c;他们在互动出版网、当当网、卓越网等大型IT书店中购买了《网管员必读》系列第二版时&#xff0c;在下订单后常常被告知有些图书缺货无法发货。本来就是想购买全套的&#xff0c;结果无奈地少了几本&#xff08;如《网管员必读——网络应…

python函数应用实例_【Python 第22课】 函数应用示例

前两课稍稍介绍了一下函数&#xff0c;但光说概念还是有些抽象了&#xff0c;今天就来把之前那个小游戏用函数改写一下。我希望有这样一个函数&#xff0c;它比较两个数的大小。如果第一个数小了&#xff0c;就输出“too small”如果第一个数小了&#xff0c;就输出“too big”…

linux内核开发_Linux 内核的代码仓库管理与开发流程简介

作者简介&#xff1a;老 U&#xff0c;致力于开源自由软件推广。原创雄文&#xff1a;由泰晓读者投递的各类社区原创好文。版权声明&#xff1a;本文最先发表于 “泰晓科技” 微信公众号&#xff0c;欢迎转载&#xff0c;转载时请在文章的开头保留本声明。入门 Linux 内核学习时…

Java中八种基本数据类型占用字节空间总结

一、Java四大数据类型分类 1、整型 byte 、short 、int 、long 2、浮点型 float 、 double 3、字符型 char 4、布尔型 boolean 二、八种基本数据类型 三、数据类型详细介绍 整型&#xff08;byte、short、int、long&#xff09; 虽然byte、short、int、long 数据类型…

String类能被继承吗,为什么?

不能被继承&#xff0c;因为String类有final修饰符&#xff0c;而final修饰的类是不能被继承的。 Java对String类的定义&#xff1a; final修饰符的用法&#xff1a; 1.修饰类 当用final修饰一个类时&#xff0c;表明这个类不能被继承。final类中的成员变量可以根据需要设为…

webstorm 不知道手贱点了什么,有时候会自动删除分号

https://segmentfault.com/q/1010000009184137?_ea1845711 webstorm 不知道手贱点了什么&#xff0c;有时候会自动删除分号 webstorm javascript 繁忙的耗子 4月25日提问关注 4 关注收藏 0 收藏&#xff0c;470 浏览问题对人有帮助&#xff0c;内容完整&#xff0c;我也想…

mysql中的所有类型_mysql中常用的数据类型

MySQL是一种关系数据库管理系统&#xff0c;关系数据库将数据保存在不同的表中&#xff0c;而不是将所有数据放在一个大仓库内&#xff0c;这样就增加了速度并提高了灵活性。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策&#xff0c…

final和static的区别

很多时候会容易把static和final关键字混淆&#xff0c;static作用于成员变量用来表示只保存一份副本&#xff0c;而final的作用是用来保证变量不可变。看下面这个例子 每次打印的两个j值都是一样的&#xff0c;而i的值却是不同的。从这里就可以知道final和static变量的区别了。…

用Visual C#创建Windows服务程序

用Visual C#创建Windows服务程序一&#xff0e;Windows服务介绍&#xff1a;Windows服务以前被称作NT服务&#xff0c;是一些运行在Windows NT、Windows 2000和Windows XP等操作系统下用户环境以外的程序。在以前&#xff0c;编写Windows服务程序需要程序员很强的C或C功底。然而…

清除掉AD的相关属性!

今天有朋友问我怎么清除掉AD 的相关属性&#xff0c;由于他们的用户都设置了登录到属性&#xff0c;这样我们的用户就仅仅能登陆他须要设置的计算机。对于兴许规则的变更的时候&#xff0c;我们的管理员配置起来就比較复杂。他须要非常长的时间去一个一个清除掉相关的属性。这对…

《Ext详解与实践》节选:自定义单元格的显示格式

有时候&#xff0c;需要在Grid中显示一个链接&#xff0c;或根据数字的大小显示不同的颜色&#xff0c;又或者使用固定格式显示记录编号等&#xff0c;这就需要自定义单元格的显示格式。在Ext的Grid可以很容易的实现自定义单元格的显示格式。在定义Grid的ColumnModel的时候&…

正则化线性回归

1. 模型的欠拟合、过拟合无论是回归问题还是分类问题都可能存在模型的欠拟合和过拟合的情况。下图是回归问题中的例子&#xff1a;第一个模型欠拟合&#xff0c;第二个模型刚好拟合&#xff0c;第三个过拟合。下图是分类问题中的例子&#xff1a;第一个模型欠拟合&#xff0c;第…

Photoshop的批处理(有海量的数码照片,想传上网的话就看下)

每次狂按快门的结果就是得到海量的数码照片&#xff0c;想传上网的话&#xff0c;最起码也要做一些尺寸方面的处理&#xff0c;这么多照片&#xff0c;真的要一张一张处理吗&#xff1f;Photoshop自有好用的Action工具帮我们做批处理。 一、前期准备 在图片所在文件夹里添加一个…

推荐系统中的矩阵分解演变方式

推荐算法主要分为基于内容的算法和协同过滤. 协同过滤的两种基本方法是基于邻居的方法(基于内容/物品的协同过滤)和隐语义模型. 矩阵分解乃是实现隐语义模型的基石.矩阵分解依据用户对物品的评分, 判断出用户和物品的隐语义向量, 然后依据用户和物品的隐语义向量来进行推荐.推荐…

Java中Class.forName和 ClassLoader.loadClass()区别

一、类加载过程 装载&#xff1a;通过累的全限定名获取二进制字节流&#xff0c;将二进制字节流转换成方法区中的运行时数据结构&#xff0c;在内存中生成Java.lang.class对象&#xff1b; 链接&#xff1a;执行下面的校验、准备和解析步骤&#xff0c;其中解析步骤是可以选…