ndk 开发没什么神秘的
ndk 说白了就是一个交叉编译的工具链,用它来生成各个CPU架构下的静态或动态链接库,linux 下就是 .a 和 .so 文件。
原理就是 java 通过 JNI 和 C、C++ 进行交互, 主要用于有大量计算的CPU密集型任务,如游戏和图形图像渲染等。
在安全方面核心代码也经常打成 .so 文件,一方面是各个平台复用,另一方面是增加逆向破解的难度。
生成 .so 文件后打包到 apk 中的 lib 文件夹下就行了。

最原始的方法,native 代码写完后用 ndk 工具生成 .so 文件, 手动打包到 apk 中的 lib 下, 手动签名,测试成功。

这种自己打包的方式就是太繁琐了,当然自己写个脚本或小工具也可以。

下面看看IDE中怎么做

1 老式方法 手动 build

src/main/jni 下放上你的原文件 Android.mk 和 Application.mk

ndk-build 底层包装了 gnumake, Android.mk 和 Application.mk 都是配置  makefile 的参数

Android.mk

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)LOCAL_MODULE    := hello   # 生成的静态链接库或动态链接库的名字, linux 下生成 libhello.so
LOCAL_SRC_FILES := hello-jni.c # 所有的源文件,空格隔开include $(BUILD_SHARED_LIBRARY) # 生成动态链接库

Application.mk

APP_ABI := all   # 生成所有CPU架构下的库,如果没有 Application.mk 默认只会生成 arm 架构下的库

hello-jni.c  没什么说的

#include <jni.h>jstring Java_com_example_lesliefang_myapplication_MainActivity_stringFromJNI(JNIEnv *env,jobject thiz) {return (*env)->NewStringUTF(env, "Hello from JNI !  ");
}

jni.h 是 jdk 中的头文件,在 jdk 安装目录下,自己有必要看一下

java 层代码,没什么可说的

public class MainActivity extends Activity {TextView textView;static {System.loadLibrary("hello");}public native String stringFromJNI();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = (TextView) findViewById(R.id.textview1);textView.setText(stringFromJNI());}
}

build.gradle 中添加如下配置

android {sourceSets{main{jni.srcDirs = [] // 阻止 gradle 自己生成 Android.mk 文件,因为我们自己写了jniLibs.srcDir 'src/main/libs' // 打包时从这里拿 .so 文件}}
}

切换到 src/main/jni 目录下执行 ndk-build 就在 libs 下生成了各个平台的库文件

目录结构是这样的

下面运行就行了, 自动会把你的  .so 文件打包到 apk 中的 lib 文件夹下。

2 Android studio 1.3 后就支持集成 ndk 了,这样就不用手动 build 了, Android.mk 也可以不写了

File->Project Structure 中配上你 ndk 的路径,没有就先下载

这跟直接在 local.properties 写是一样的

ndk.dir=/Users/lesliefang/leslie/android/android-ndk-r10e
sdk.dir=/Users/lesliefang/leslie/android/android-sdk-macosx

build.gradle 中添加一个配置

android {defaultConfig {ndk {moduleName "hello"  // 要生成的库文件的名称}}
}

现在目录结构是这样的,  Android.mk 和 Application.mk 都不要了

点击运行,自动编译生成.so文件并打包到 apk 中

但现在 android studio 对 C 和 C++ 的调试支持还只是实验阶段 ,下次看一下 gdb 手动调试和 IDE 调试。

JNI 远没有这么简单,要想熟练的用JNI 、C 和 C++开发还有很长的路要走

转载于:https://www.cnblogs.com/lesliefang/p/5159561.html

android studio ndk 开发入门相关推荐

  1. JNI编程基础(二)——Android Studio NDK开发

    由于笔者目前的工作是Android开发,所以在JNI开发系列博客中穿插一篇AndroidStudio NDK开发介绍. 随着Android Studio 2.2的推出,Android Studio的N ...

  2. Android Studio NDK 开发配置

    一:使用gradle experimental plugin 首先,我们不能用android studio默认的gradle插件,我们需要把android studio的插件改为gradle expe ...

  3. Android Studio NDK开发

    以前接触过NDK的开发,是在Eclipse环境下开发的.今天尝试了下用Android Studio来配置,结果真是处处都是坑,现在总结一下: 一.步骤 1. 首先创建MainActivity,添加na ...

  4. Android Studio NDK 开发

    1.SDK Tools下载DNK,如果已经有下载有DNK的开发工具的话,可以直接导入 当然,AS后面推荐使用CMake方式开发NDK,这个后面再说,这里还是先讲ndk+javah+Android.mk ...

  5. 学习笔记 | Android Studio安卓开发入门经验总结 干货

    前言 最近完成了移动编程课程的学习,加上其它安卓开发项目的经历,感觉收获颇为丰富.故在此总结整理安卓开发中比较常见的一些问题,技巧和指南. 0.目录 文章目录 前言 0.目录 1.开发环境 2. 项目 ...

  6. Android Studio App开发入门之选择按钮的讲解及使用(包括复选框,开关按钮,单选按钮,附源码)

    运行有问题或需要图片资源请点赞关注收藏后评论区留言~~~ 在学习复选框之前,先了解一下CompoundButton,在Android体系中,CompoundButton类是抽象的复合按钮,因为是抽象类 ...

  7. Android Studio App开发入门之在活动之间传递消息(附源码 超详细必看)(包括显示和隐式Intent,向上一个和下一个Activity发送数据)

     运行有问题或需要源码请点赞关注收藏后评论区留言~~ 显示Intent和隐式Intent Intent是各个组件之间的信息沟通的桥梁,既能在Activity之间沟通,又能在Activity与Servi ...

  8. android studio 和gcc,Android Studio NDK开发总结

    一,gcc.make.makefile.cmake.cmakelists区别 1.gcc是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多 ...

  9. Andorid Studio NDK 开发 - Hello World

    原址 介绍了在Android Studio中配置NDK的开发环境:Android Studio NDK开发-环境配置,NDK开发环境配置完成之后,就要写一下著名的Hello World程序了. 在开始 ...

  10. Android Studio 教程:入门开发第一个程序

    Android Studio 教程:入门开发第一个程序 2018.09.11 14:30 16005浏览 开发第一应用 可以开发属于自己的应用,是否有点小激动?好吧!让我们开始,首先点击Start a ...

最新文章

  1. android开发学习 ------- 弹出框
  2. ubuntu 安装pycharm
  3. 数据挖掘 概念与技术(原书第3版)
  4. Java Socket 客户端使用指定端口多次连接服务器引发 BindException
  5. oracle排序使用,很多中函数,不同的效果
  6. Django-Model中的ForeignKey,ManyToManyField与OneToOneField
  7. python教程循环语句,Python基础教程之循环语句(for、while和嵌套循环)
  8. dft对称性 matlab实验,数字信号处理实验指导书(审)
  9. Java高并发程序设计学习笔记(五):JDK并发包(各种同步控制工具的使用、并发容器及典型源码分析(Hashmap等))...
  10. 几何建模研究领域介绍(名词解释)
  11. paip.ASP 开发调试大总结
  12. 【胸片分割】基于matlab GUI最小误差法胸片分割系统【含Matlab源码 1065期】
  13. Google cloud 存储 Storage
  14. List数组转换JSON格式
  15. 黄健计算机科学与技术学院,计算机科学与技术学院研究生学业奖学金初评结果汇总表...
  16. RNN denoise
  17. 康涅狄格大学计算机科学排名,2015年US News美国大学计算机专业 Computer Science排名?...
  18. 【MySQL 09】安装mysql时出现:需要这两个包perl(Data::Dumper),perl(JSON)
  19. Vivado IP核之浮点数加减法 Floating-point
  20. CocosCreator 2.4.1版本 打包微信抖音小游戏CDN配置问题

热门文章

  1. 对有序特征进行离散化(继承Spark的机器学习Estimator类)
  2. CSS 常见的8种选择器 和 文本溢出问题
  3. port 执行命令的封装和参数详解
  4. 关于 C# 请求 https 那点事
  5. 选择要素选择集中的某个图层的要素
  6. [原创]测试用例设计策略
  7. group by分组后获得每组中时间最大的那条记录
  8. 基于VUE实现的新闻后台管理系统-三
  9. java for语句
  10. HDU 1754 I Hate It 线段树RMQ