Android-JNINDK(一)入门
[TOC]
Android-JNI&NDK(一)入门
原文
一. 前言
最近项目中要求要使用so库实现数据加密,来提高数据的安全性,因为好久没用过Android调用native方法,特别写这一篇回忆一下用法。
官方教程
二. 简介
NDK(Native Development Kit)
- Android NDK 是一套允许您使用原生代码语言(例如 C 和 C++)实现部分应用的工具集。在开发某些类型应用时,这有助于您重复使用以这些语言编写的代码库。
- NDK的作用
- 从设备获取卓越性能以用于计算密集型应用,例如游戏或物理模拟。
- 重复使用您自己或其他开发者的 C 或 C++ 库。
- 代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
JNI(Java Native Interface)
- JNI 是本地编程接口,它使得在 Java 虚拟机内部运行的 Java 代码能够与用其它语言(如 C、C++)编写的代码进行交互。
- JNI的作用
- 可以让java调用c语言的代码。
三. NDK安装
在AndroidStudio
中打开SDKManager
下载更新ndk
四. JNI使用
创建项目
首先创建一个AS项目。
配置gradle.properties文件
android.useDeprecatedNdk=true复制代码
在local.properties中加入ndk和sdk的路径:
ndk.dir=/Users/xxx/Library/Android/sdk/ndk-bundlesdk.dir=/Users/xxx/Library/Android/sdk复制代码
配置build.gradle中配置ndk的生成的so名字和支持的CPU平台(下文会介绍在如何Android.mk中去配置)。
ndk{moduleName "hello" //生成的so文件名字,调用C程序的代码中会用到该名字abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种平台下的so库}复制代码
项目的准备工作做完了,接下来是代码的部分。
使用JNI
创建native方法
public class MainActivity extends AppCompatActivity {TextView mHelloText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mHelloText = (TextView) findViewById(R.id.hello);}public native String sayHelloByJNI();}复制代码
使用
javah -jni
命令MainActivity.java生成JNI的.h文件。cd app/src/main/java javah -jni co.fensan.android.jnidemo.MainActivity复制代码
发现在当前目录生成了
co_fensan_android_jnidemo_MainActivity.h
创建JNI目录并将.h文件移动到jni目录
然后创建.cpp文件
#include "co_fensan_android_jnidemo_MainActivity.h"JNIEXPORT jstring JNICALLJava_co_fensan_android_jnidemo_MainActivity_sayHelloByJNI(JNIEnv *env, jobject instance) {return env->NewStringUTF("hello jni!");}复制代码
- 在MainActivity中引入hello库
public class MainActivity extends AppCompatActivity {static {System.loadLibrary("hello");}TextView mHelloText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mHelloText = (TextView) findViewById(R.id.hello);mHelloText.setText(sayHelloByJNI());}public native String sayHelloByJNI();}复制代码
![image](http://ohqvqufyf.bkt.clouddn.com/ndk_%E5%BC%95%E5%85%A5lib.png)复制代码
五. 运行结果
源码传送门
转载于:https://juejin.im/post/5a0a5c44f265da43133caa1d
Android-JNINDK(一)入门相关推荐
- 5G 时代的 Android App 开发入门与项目实战
随着移动互联网的持续发展,Android系统从智能手机逐步拓展到平板电脑.智能电视.车载大屏.智能家居.智能手表等诸多设备,Android开发依然是前景可期的IT岗位. 当然,整个社会正在迈向5G时代 ...
- 《Android应用开发入门经典(第3版)》——第6.1节创建演示应用
本节书摘来自异步社区<Android应用开发入门经典(第3版)>一书中的第6章,第6.1节创建演示应用,作者 [美]Carmen Delessio , Lauren Darcey , Sh ...
- 《Android应用开发入门经典(第3版)》——导读
本节书摘来自异步社区<Android应用开发入门经典(第3版)>一书中的目录,作者 [美]Carmen Delessio , Lauren Darcey , Shane Conder,更多 ...
- Android渗透测试Android渗透测试入门教程大学霸
Android渗透测试Android渗透测试入门教程大学霸 第1章 Android渗透测试 Android是一种基于Linux的自由及开放源代码的操作系统,主要用于移动设备,如智能手机.平板等.目前 ...
- Android 游戏开发入门
Android 游戏开发入门 图书描述: Android系统已经红遍了大江南北,持有Android设备的人也在不断增长.看着大街上用手指划着手机玩游戏的人,你有没有一种自己做一个游戏的想法呢?然而,入 ...
- 010 Android之逆向入门
文章目录 Android APK文件结构 META-INF res AndroidManifest.xml classes.dex resources.arsc lib Assets Android ...
- Android自动化测试-从入门到入门(5)AdapterView的测试
在之前的文章中,我们简单介绍了Espresso的使用.通过onView()方法我们可以快速定位到界面上我们需要测试的目标元素.整体来说,onView()比较适用于UI比较简单的情况,在不需要过于复杂的 ...
- android 自动补全方法,Android零基础入门|自动完成文本框AutoCompleteTextView
原标题:Android零基础入门|自动完成文本框AutoCompleteTextView 上一期学习的Spinner的使用,掌握的怎么样?本期一起来学习AutoCompleteTextView的使用. ...
- 《Android游戏编程入门经典》——1.7节小结
本节书摘来自异步社区<Android游戏编程入门经典>一书中的第1章,第1.7节小结,作者[美]Jonathan S. Harbour,更多章节内容可以访问云栖社区"异步社区&q ...
- [Android]Thread线程入门3--多线程
经过 [Android]Thread线程入门1 和[Android]Thread线程入门2 的学习,我们对线程有了简单的了解.在实际应用中,一般都会用到多线程.很少像前面的例子这么简单.那么如何实现多 ...
最新文章
- 技术扫盲:关于低代码编程的可持续性交付设计和分析
- Android新手之旅(10) 嵌套布局
- html不能超出div的宽度,DIV设置width后超出父元素应该如何解决
- java 基本类型内存_java基本数据类型、内存分析、装包拆包
- Spring Boot 2动态修改日志级别
- 一键导出Origin图片MATLAB代码
- Spring Boot Spring MVC异常处理原理分析
- AAAI 2019 Oral | 把Cross Entropy梯度分布拉‘平’,就能轻松超越Focal Loss
- centos 6.4 FTP安装和配置
- html块状元素高度,CSS:如何计算块元素的高度?
- ES6常用知识总结(20%的知识占80%的份额)
- [XSS神器]XssEncode chrome插件 - 0x_Jin
- access如何设置定期报表汇总_报表工具选型对比系列 - 大报表
- HDU 2859 Phalanx(二维DP)
- python初体验(2)——面向对象篇
- WIN10访问linux分区「ext2fsd」
- H264 编解码协议详解
- 阿甘正传中的人生哲理
- android studio海马玩模拟器
- mysql怎么初始化自增值_MySql中重新设置AUTO_INCREMENT自增值方法