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 开发入门的更多相关文章

  1. Android Studio NDK开发入门

    从Android Studio 1.3 Beta1开始,就支持了NDK,我目前使用的版本是1.5.首先强调几点. 1.必须安装NDK并配置好环境变量(和配置JDK环境变量如出一辙:新建NDK_HOME ...

  2. Android Studio JNI开发入门教程

    Android Studio JNI开发入门教程 2016-08-29 14:38 3269人阅读 评论(0) 收藏 举报  分类: JNI(3)    目录(?)[+]   概述 在Andorid ...

  3. 【Android】Android Studio NDK 开发

    Android Studio NDK 开发 记录在Android Studio中NDK简单开发的步骤 用到的Android Studio版本为3.5. 配置NDK 下载NDK 一般在SDK下已经有自带 ...

  4. (原)使用android studio ndk开发流程

    先使用android stuido创建一个app工程,创建工程的时候,.gradle目录结构下为2.8目录.(note:2.10目录为后续更新结果出现.) 依次修改上述红色方框标注部分内容: 1)修改 ...

  5. Android Studio NDK开发环境搭建

    一.   下载安装Android studio 和 NDK 二.   在Android studio中配置NDK(和SDK配置一样) 三.   用Android studio建立一个工程,打开proj ...

  6. Android Studio NDK开发-JNI调用Java方法

    相对于NDK来说SDK里面有更多API可以调用,有时候我们在做NDK开发的时候,需要在JNI直接Java中的方法和变量,比如callback,系统信息等.... 如何在JNI中调用Java方法呢?就需 ...

  7. Android Studio NDK开发浅谈

    环境: Android Studio 1.1.0 NDK-r10d 1.新建项目--->包名:com.mxl.az.ndk 新建包含native方法的类:JniOperation.class p ...

  8. Android Studio && NDK开发

    Android Studio下载安装网址:http://www.android-studio.org/index.php/download/hisversion 在下载界面可以查看安装包内是否包含SD ...

  9. Android Studio NDK 开发 问题记录

    Android NDK 开发 问题解决 编译:找不到gles3库 使用旧的编译方式,写Android.mk 进行编译.报错如下 gles3/gl3.h no such file or director ...

随机推荐

  1. 3、Docker能干什么?

    简化配置   这是Docker公司宣传的Docker的主要使用场景.虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件.系统),Docker在降低额外开销的情况下提供了同样的功能.它能 ...

  2. oracle ebs 11i > concurrent programs –> request group –> responsibility

    --concurrent programs --request group --responsibility SELECT fr.responsibility_key,       fr.respon ...

  3. Android-SQLiteOpenHelper里增删改查

    为什么要写一篇,Android-SQLiteOpenHelper里增删改查,的文章呢: 因为之前的方式是:MySQLiteOpenHelper(只负责 生成打开据库/生成打开表/升级表),在其他端:完 ...

  4. Android-bindService本地服务-音乐播放-上

    播放音乐的行为写在服务里,Activity去调用Service里面到方法,进行音乐播放,当Activity结束后,音乐播放器停止播放 界面: MainActivity: package liudeli ...

  5. mysql初次登陆跳过密码并初始化密码

    如下均已mysql5.7为标准版本. 1.重置密码的第一步就是跳过MySQL的密码认证过程,方法如下: #vim /etc/my.cnf(注:windows下修改的是my.ini) 在文档内搜索mys ...

  6. css细节复习笔记——基本视觉格式化

    css包含如此开放.如此强大的一个模型,对于这样一个模型,可以有无数种方法结合应用各种属性,可以得到的效果数不胜数. 基本框 css假定每个元素都会生成一个或多个矩形框,这称为元素框.各元素中心有一个 ...

  7. python--函数名的使用,闭包,迭代器

    1.函数名的使用和第一类对象 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数 函数对象可以像变量一样进行赋值,还可以作为列表的元素进行使用,可以作为返回值返回,可以作为参数进行传递 1 ...

  8. 一次mysql调优过程

    由于经常被抓取文章内容,在此附上博客文章网址:,偶尔会更新某些出错的数据或文字,建议到我博客地址 :  --> 点击这里 前几天进行了一个数据库查询,比较缓慢,便查询了一下,在这里记录一下,方便 ...

  9. (转)科普:SATA、PCIe、AHCI、NVMe

    原文链接:https://forum.51nb.com/thread-1670848-1-1.html IT 界总喜欢发明新名词.而且同一个东西,可能有几个不同的名字.同一个名字,又可能指不同的东西. ...

  10. java使用memcached2--集群部署

    一.集群安装 1.编译安装magent-0.5到/usr/local/下 # cd /usr/local # mkdir magent # cd magent/ # wget http://memag ...