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();
@Override
protected 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++开发还有很长的路要走
android studio ndk 开发入门的更多相关文章
- Android Studio NDK开发入门
从Android Studio 1.3 Beta1开始,就支持了NDK,我目前使用的版本是1.5.首先强调几点. 1.必须安装NDK并配置好环境变量(和配置JDK环境变量如出一辙:新建NDK_HOME ...
- Android Studio JNI开发入门教程
Android Studio JNI开发入门教程 2016-08-29 14:38 3269人阅读 评论(0) 收藏 举报 分类: JNI(3) 目录(?)[+] 概述 在Andorid ...
- 【Android】Android Studio NDK 开发
Android Studio NDK 开发 记录在Android Studio中NDK简单开发的步骤 用到的Android Studio版本为3.5. 配置NDK 下载NDK 一般在SDK下已经有自带 ...
- (原)使用android studio ndk开发流程
先使用android stuido创建一个app工程,创建工程的时候,.gradle目录结构下为2.8目录.(note:2.10目录为后续更新结果出现.) 依次修改上述红色方框标注部分内容: 1)修改 ...
- Android Studio NDK开发环境搭建
一. 下载安装Android studio 和 NDK 二. 在Android studio中配置NDK(和SDK配置一样) 三. 用Android studio建立一个工程,打开proj ...
- Android Studio NDK开发-JNI调用Java方法
相对于NDK来说SDK里面有更多API可以调用,有时候我们在做NDK开发的时候,需要在JNI直接Java中的方法和变量,比如callback,系统信息等.... 如何在JNI中调用Java方法呢?就需 ...
- Android Studio NDK开发浅谈
环境: Android Studio 1.1.0 NDK-r10d 1.新建项目--->包名:com.mxl.az.ndk 新建包含native方法的类:JniOperation.class p ...
- Android Studio && NDK开发
Android Studio下载安装网址:http://www.android-studio.org/index.php/download/hisversion 在下载界面可以查看安装包内是否包含SD ...
- Android Studio NDK 开发 问题记录
Android NDK 开发 问题解决 编译:找不到gles3库 使用旧的编译方式,写Android.mk 进行编译.报错如下 gles3/gl3.h no such file or director ...
随机推荐
- OpenGL中的需要注意的细节问题
OpenGL中的需要注意的细节问题 1. 虽然我们使用Windows的BMP文件作为纹理时,一般是蓝色的像素在最前,其真实的格式为GL_BGR而不是GL_RGB,在数据的顺序上有所 不同,但因为同样是 ...
- Oracle EBS 初始化用户密码
---修改密码,并且将限制用户下次登录的时候(第一次登录),强制要换一个新的口令: ---此过程可以完全模拟我们在标准用户的Form里面初始化用户的密码的动作! ---最后要说明的是,这个处理过程 ...
- 溢出文本省略号表示的css实现及polyfill
需求经常有需要对文字溢出进行处理,通常是在文字显示部分的末尾添加“...”等.如下:
- 常用脚本--SQL Server获取OS日志
--=================================================== --SQL Server获取OS日志: ), ), ), ) select @start_d ...
- nmon在secureCRT下显示乱码问题
# 背景 下载安装了nmon,结果发现显示有问题,如下 # 解决 猜测应该是字体编码问题,查阅了解后,是因为CRT设置问题,需要修改下配置,(之前试用xshell比较棒,但公司禁止试用),如下修改 然 ...
- C++的一些知识点摘抄(创建基本类 高级类)
问:对象有多大? 答:对象占据的内存量取决于其成员变量的长度,类函数不占据为对象分配的内容. 有些编译器在内存中对齐变量,这导致2字节变量实际占用的内存多于2字节. 问:为何不应将所有成员数据声明为公 ...
- FIM控制同步用户
C:\Program Files\Microsoft Office Servers\15.0\Synchronization Service\UIShell 这个路径下,你如果懂FIM,可以进去看看 ...
- js ajax请求传token
js ajax请求传token 方法一: headers: { Authorization: "BasicAuth " + token } 方法二: beforeSend: fu ...
- 洛谷P3964 [TJOI2013]松鼠聚会(坐标系变换)
题面 传送门 题解 对于两个点\((x_i,y_i)\)和\(x_j,y_j\),我们定义它们之间的曼哈顿距离为 \[|x_i-x_j|+|y_i-y_j|\] 定义它们的切比雪夫距离为 \[\max ...
- jmeter服务器监控插件指标简单说明
以下是下载了服务器监控插件的各个组件的功能介绍,有助于以后jmeter的性能测试 1.jp@gc - Actiive Threads Over Time:不同时间的活动用户数量展示(图表) 当前的时间 ...