[TOC]

Android-JNI&NDK(一)入门

原文

一. 前言

最近项目中要求要使用so库实现数据加密,来提高数据的安全性,因为好久没用过Android调用native方法,特别写这一篇回忆一下用法。

官方教程

二. 简介

NDK(Native Development Kit)

  1. Android NDK 是一套允许您使用原生代码语言(例如 C 和 C++)实现部分应用的工具集。在开发某些类型应用时,这有助于您重复使用以这些语言编写的代码库。
  2. NDK的作用
    • 从设备获取卓越性能以用于计算密集型应用,例如游戏或物理模拟。
    • 重复使用您自己或其他开发者的 C 或 C++ 库。
    • 代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。

JNI(Java Native Interface)

  1. JNI 是本地编程接口,它使得在 Java 虚拟机内部运行的 Java 代码能够与用其它语言(如 C、C++)编写的代码进行交互。
  2. JNI的作用
    • 可以让java调用c语言的代码。

三. NDK安装

AndroidStudio中打开SDKManager下载更新ndk

NDK下载

四. JNI使用

创建项目

  1. 首先创建一个AS项目。

    image
  2. 配置gradle.properties文件

         android.useDeprecatedNdk=true复制代码
    image
  3. 在local.properties中加入ndk和sdk的路径:

     ndk.dir=/Users/xxx/Library/Android/sdk/ndk-bundlesdk.dir=/Users/xxx/Library/Android/sdk复制代码
    image
  4. 配置build.gradle中配置ndk的生成的so名字和支持的CPU平台(下文会介绍在如何Android.mk中去配置)。

     ndk{moduleName "hello"       //生成的so文件名字,调用C程序的代码中会用到该名字abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种平台下的so库}复制代码
    image

项目的准备工作做完了,接下来是代码的部分。

使用JNI

  1. 创建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();}复制代码
    image
  2. 使用javah -jni命令MainActivity.java生成JNI的.h文件。

     cd app/src/main/java javah -jni co.fensan.android.jnidemo.MainActivity复制代码
    image

    发现在当前目录生成了co_fensan_android_jnidemo_MainActivity.h

  3. 创建JNI目录并将.h文件移动到jni目录

    image

然后创建.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!");}复制代码
image
  1. 在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)复制代码

五. 运行结果

image

源码传送门

转载于:https://juejin.im/post/5a0a5c44f265da43133caa1d

Android-JNINDK(一)入门相关推荐

  1. 5G 时代的 Android App 开发入门与项目实战

    随着移动互联网的持续发展,Android系统从智能手机逐步拓展到平板电脑.智能电视.车载大屏.智能家居.智能手表等诸多设备,Android开发依然是前景可期的IT岗位. 当然,整个社会正在迈向5G时代 ...

  2. 《Android应用开发入门经典(第3版)》——第6.1节创建演示应用

    本节书摘来自异步社区<Android应用开发入门经典(第3版)>一书中的第6章,第6.1节创建演示应用,作者 [美]Carmen Delessio , Lauren Darcey , Sh ...

  3. 《Android应用开发入门经典(第3版)》——导读

    本节书摘来自异步社区<Android应用开发入门经典(第3版)>一书中的目录,作者 [美]Carmen Delessio , Lauren Darcey , Shane Conder,更多 ...

  4. Android渗透测试Android渗透测试入门教程大学霸

    Android渗透测试Android渗透测试入门教程大学霸 第1章  Android渗透测试 Android是一种基于Linux的自由及开放源代码的操作系统,主要用于移动设备,如智能手机.平板等.目前 ...

  5. Android 游戏开发入门

    Android 游戏开发入门 图书描述: Android系统已经红遍了大江南北,持有Android设备的人也在不断增长.看着大街上用手指划着手机玩游戏的人,你有没有一种自己做一个游戏的想法呢?然而,入 ...

  6. 010 Android之逆向入门

    文章目录 Android APK文件结构 META-INF res AndroidManifest.xml classes.dex resources.arsc lib Assets Android ...

  7. Android自动化测试-从入门到入门(5)AdapterView的测试

    在之前的文章中,我们简单介绍了Espresso的使用.通过onView()方法我们可以快速定位到界面上我们需要测试的目标元素.整体来说,onView()比较适用于UI比较简单的情况,在不需要过于复杂的 ...

  8. android 自动补全方法,Android零基础入门|自动完成文本框AutoCompleteTextView

    原标题:Android零基础入门|自动完成文本框AutoCompleteTextView 上一期学习的Spinner的使用,掌握的怎么样?本期一起来学习AutoCompleteTextView的使用. ...

  9. 《Android游戏编程入门经典》——1.7节小结

    本节书摘来自异步社区<Android游戏编程入门经典>一书中的第1章,第1.7节小结,作者[美]Jonathan S. Harbour,更多章节内容可以访问云栖社区"异步社区&q ...

  10. [Android]Thread线程入门3--多线程

    经过 [Android]Thread线程入门1 和[Android]Thread线程入门2 的学习,我们对线程有了简单的了解.在实际应用中,一般都会用到多线程.很少像前面的例子这么简单.那么如何实现多 ...

最新文章

  1. 技术扫盲:关于低代码编程的可持续性交付设计和分析
  2. Android新手之旅(10) 嵌套布局
  3. html不能超出div的宽度,DIV设置width后超出父元素应该如何解决
  4. java 基本类型内存_java基本数据类型、内存分析、装包拆包
  5. Spring Boot 2动态修改日志级别
  6. 一键导出Origin图片MATLAB代码
  7. Spring Boot Spring MVC异常处理原理分析
  8. AAAI 2019 Oral | 把Cross Entropy梯度分布拉‘平’,就能轻松超越Focal Loss
  9. centos 6.4 FTP安装和配置
  10. html块状元素高度,CSS:如何计算块元素的高度?
  11. ES6常用知识总结(20%的知识占80%的份额)
  12. [XSS神器]XssEncode chrome插件 - 0x_Jin
  13. access如何设置定期报表汇总_报表工具选型对比系列 - 大报表
  14. HDU 2859 Phalanx(二维DP)
  15. python初体验(2)——面向对象篇
  16. WIN10访问linux分区「ext2fsd」
  17. H264 编解码协议详解
  18. 阿甘正传中的人生哲理
  19. android studio海马玩模拟器
  20. mysql怎么初始化自增值_MySql中重新设置AUTO_INCREMENT自增值方法

热门文章

  1. C++11 的新特性
  2. 前端三十五:图片的基本概念
  3. mybaits九:自定义结果映射规则
  4. JDBC连接为什么要释放资源---------示意图
  5. 微软发布Azure SignalR Service的预览版本
  6. ASP.NET处理架构
  7. RMAN异机恢复步骤及故障处理
  8. tomcat和resin的安装配置
  9. 在Linux(Ubuntu)下搭建ASP.NET Core环境并运行 继续跨平台
  10. Java学习笔记(1)——基本数据类型