android studio ndk 开发入门
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 开发入门相关推荐
- JNI编程基础(二)——Android Studio NDK开发
由于笔者目前的工作是Android开发,所以在JNI开发系列博客中穿插一篇AndroidStudio NDK开发介绍. 随着Android Studio 2.2的推出,Android Studio的N ...
- Android Studio NDK 开发配置
一:使用gradle experimental plugin 首先,我们不能用android studio默认的gradle插件,我们需要把android studio的插件改为gradle expe ...
- Android Studio NDK开发
以前接触过NDK的开发,是在Eclipse环境下开发的.今天尝试了下用Android Studio来配置,结果真是处处都是坑,现在总结一下: 一.步骤 1. 首先创建MainActivity,添加na ...
- Android Studio NDK 开发
1.SDK Tools下载DNK,如果已经有下载有DNK的开发工具的话,可以直接导入 当然,AS后面推荐使用CMake方式开发NDK,这个后面再说,这里还是先讲ndk+javah+Android.mk ...
- 学习笔记 | Android Studio安卓开发入门经验总结 干货
前言 最近完成了移动编程课程的学习,加上其它安卓开发项目的经历,感觉收获颇为丰富.故在此总结整理安卓开发中比较常见的一些问题,技巧和指南. 0.目录 文章目录 前言 0.目录 1.开发环境 2. 项目 ...
- Android Studio App开发入门之选择按钮的讲解及使用(包括复选框,开关按钮,单选按钮,附源码)
运行有问题或需要图片资源请点赞关注收藏后评论区留言~~~ 在学习复选框之前,先了解一下CompoundButton,在Android体系中,CompoundButton类是抽象的复合按钮,因为是抽象类 ...
- Android Studio App开发入门之在活动之间传递消息(附源码 超详细必看)(包括显示和隐式Intent,向上一个和下一个Activity发送数据)
运行有问题或需要源码请点赞关注收藏后评论区留言~~ 显示Intent和隐式Intent Intent是各个组件之间的信息沟通的桥梁,既能在Activity之间沟通,又能在Activity与Servi ...
- android studio 和gcc,Android Studio NDK开发总结
一,gcc.make.makefile.cmake.cmakelists区别 1.gcc是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多 ...
- Andorid Studio NDK 开发 - Hello World
原址 介绍了在Android Studio中配置NDK的开发环境:Android Studio NDK开发-环境配置,NDK开发环境配置完成之后,就要写一下著名的Hello World程序了. 在开始 ...
- Android Studio 教程:入门开发第一个程序
Android Studio 教程:入门开发第一个程序 2018.09.11 14:30 16005浏览 开发第一应用 可以开发属于自己的应用,是否有点小激动?好吧!让我们开始,首先点击Start a ...
最新文章
- android开发学习 ------- 弹出框
- ubuntu 安装pycharm
- 数据挖掘 概念与技术(原书第3版)
- Java Socket 客户端使用指定端口多次连接服务器引发 BindException
- oracle排序使用,很多中函数,不同的效果
- Django-Model中的ForeignKey,ManyToManyField与OneToOneField
- python教程循环语句,Python基础教程之循环语句(for、while和嵌套循环)
- dft对称性 matlab实验,数字信号处理实验指导书(审)
- Java高并发程序设计学习笔记(五):JDK并发包(各种同步控制工具的使用、并发容器及典型源码分析(Hashmap等))...
- 几何建模研究领域介绍(名词解释)
- paip.ASP 开发调试大总结
- 【胸片分割】基于matlab GUI最小误差法胸片分割系统【含Matlab源码 1065期】
- Google cloud 存储 Storage
- List数组转换JSON格式
- 黄健计算机科学与技术学院,计算机科学与技术学院研究生学业奖学金初评结果汇总表...
- RNN denoise
- 康涅狄格大学计算机科学排名,2015年US News美国大学计算机专业 Computer Science排名?...
- 【MySQL 09】安装mysql时出现:需要这两个包perl(Data::Dumper),perl(JSON)
- Vivado IP核之浮点数加减法 Floating-point
- CocosCreator 2.4.1版本 打包微信抖音小游戏CDN配置问题