Android:随笔——新的 NDK/JNI 调用方式

转载请标明地址 QuincySx: http://www.jianshu.com/p/c6108131ba0f

众所周知现在 Android 开发已经到了 Android Studio 的时代,那么 JNI 的调用方式也经过了好几代

  1. 在eclipse 时代就存在的 ndk-build 方式
  1. 使用 Google 官方的 com.android.tools.build:gradle-experimental 简书地址
  2. CMake 方式,支持断点调试,这也是今天要说的是一种方式

使用 CMake 这种方式有几个条件

  1. Android Studio 2.2 或更高版本
  1. Android Plugin for Gradle 版本 2.2.0 或更高版本

好了下面需要下点必要工具 下载 NDK 和构建工具 要为您的应用编译和调试原生代码,您需要以下组件:
Android 原生开发工具包 (NDK):这套工具集允许您为 Android 使用 C 和 C++ 代码,并提供众多平台库,让您可以管理原生 Activity 和访问物理设备组件,例如传感器和触摸输入。
CMake:一款外部构建工具,可与 Gradle 搭配使用来构建原生库。如果您只计划使用 ndk-build,则不需要此组件。
LLDB:一种调试程序,Android Studio 使用它来调试原生代码。

Paste_Image.png

如图显示的三个 就是需要下载的三个

使用 CMake 有两种方式

  1. 第一种方式 是在项目创建的时候
  1. 第二种是在现有项目上添加

第一种方式

我们先介绍第一种方式 : 是建立新项目的时候

创建项目

复选 include C++ support 然后和正常项目一样一直 Next 下一步

配置项目
  • C++ Standard:使用下拉列表选择您希望使用哪种 C++ 标准。选择 Toolchain Default 会使用默认的 CMake 设置。
  • Exceptions Support:如果您希望启用对 C++ 异常处理的支持,请选中此复选框。如果启用此复选框,Android Studio 会将 -fexceptions 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。
  • Runtime Type Information Support:如果您希望支持 RTTI,请选中此复选框。如果启用此复选框,Android Studio 会将 -frtti 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。

根据自己情况选取 饭后点击 Finish

在这种情况下 如果没有安装 CMake Android Studio 会提示安装

这是项目结构


项目结构

第二种方式

第二种方式是 : 在原有想的基础上添加

这种方式有三个步骤

  • 创建新的原生源文件并将其添加到您的 Android Studio 项目中。如果您已经拥有原生代码或想要导入预构建的原生库,则可以跳过此步骤。
  • 创建 CMake 构建脚本将您的原生源代码构建到库中。如果导入和关联预构建库或平台库,您也需要此构建脚本。如果您的现有原生库已经拥有CMakeLists.txt构建脚本或者使用 ndk-build 并包含Android.mk构建脚本,则可以跳过此步骤。
  • 提供一个指向您的 CMake 或 ndk-build 脚本文件的路径,将 Gradle 关联到您的原生库。Gradle 使用构建脚本将源代码导入您的 Android Studio 项目并将原生库(SO 文件)打包到 APK 中。

首先在自己的模块下新建 JNI 目录

Paste_Image.png

然后切换显示模式为 project 在 src > main 下会出现一个 jni 的目录 创建c文件 名字随意

然后在新建的文件夹下创建 C 的文件

如果需要头文件 则需要勾选 Create an associated header

然后创建 CMakeLists.txt 文件 在模块根目录下创建(名字一定要是 CMakeLists.txt)

然后我们需要在文件中添加 cmake_minimum_required() 与 add_library() 两个方法

#指定 CMake 的最小版本
cmake_minimum_required(VERSION 3.4.1)

add_library( 
             #模块名 
             native

             #设置模块是可共享的
             SHARED

             #C 文件的具体路径 注意确认文件名后缀
             src/main/jni/native.cpp )

# 指定头文件路径 这里我没有创建 头文件先注释掉
# include_directories(src/main/jni/)

然后关联 CMake 与 Gradle

自动的方式
Paste_Image.png

选择我们创建的 CMakeLists.txt 文件 点击完成等待

手动方式
android {
  ...
  defaultConfig {...}
  buildTypes {...}

  // Encapsulates your external native build configurations.
  externalNativeBuild {
    // Encapsulates your CMake build configurations.
    cmake {
      // Provides a relative path to your CMake build script.
      path "CMakeLists.txt"
    }
  }
}

然后在 JAVA 中调用

在 Java 代码中 调用的时候 添加 这里的名字一定要和上面一致

static {
        System.loadLibrary("native");
    }

private native String getStr();

然后在书写一下 C 文件 (这里我创建的是 C++ 文件)

#include <jni.h>

JNIEXPORT jstring JNICALL
Java_com_a21vianet_quincysx_demo_jnidemo_MainActivity_getStr(JNIEnv *env, jclass type) {
    char str[] = "我是C";
    return (*env).NewStringUTF(str);
}

总结

这只是最简单的一个 小例子,我水平不高也在学习,深入学习后会有更多的文章分享给大家

水平问题,难免会有错误,多谢各位指正

参考资料


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容