Android JNI开发系列之配置

在老早以前就想要去接触了解这一块的知识了,奈何在工作中一直都没有机会去接触,就迟迟没有去学习这一块的知识。到现在终于开始去学习了,简单的搜索了一下,都没有太明确的博客去学习,都是很零碎的,而且在最新的版本中也有问题,到最后只能去看官方的文档,当然这才正确的选择,其实一开始就该去看的。废话不多说,这一个系列因为我才开始学习,不知道会有多长,但是会将常用的东西全部总结学习完。

首先来学习一下官方的配置。

一、必要的下载

这一条没啥说的,就是下载一些工具方便开发,当然是在Android Studio中。

对于ndk的开发,需要下载:

  • NDK(Native Development Kit):用来让你调用c或者c++代码的工具
  • cmake:方便在gradle中构建的,不再使用以前的ndk-build(比较麻烦)
  • LLDB:可以调试c或者c++代码的

这三个都可以直接在SDK Manager中去下载(当然也可以手动下载配置好)。目前我使用的版本对应分别是:

NDK : 17.1.4828580
cmake : 3.6.4111459
LLDB : 3.1.4508709

二、在项目中配置NDK

这一点分为两种情况:

  • 新建项目时配置
  • 在已有项目中配置

第一种情况没啥说的,就是在新建项目时,选中第一个界面的include C++ support这个选择框,之后一直默认next(最后finish)即可。

重点是第二种情况,因为大多数在在项目一开始时可能没有想着要使用ndk开发功能,后来需要了,那么就去配置即可。

1、创建cpp文件夹

在已有项目的main目录下创建cpp文件夹

2、创建一个c文件

在cpp文件夹下创建一个c文件,右键->new->c/c++ Source File,例如取名叫做Hello,后缀名为.c,不创建.h文件,点击ok。

注:内部暂时可以不用写代码。

3、创建CMakeLists.txt

在当前module中创建一个CMakeLists.txt文件,右键->new->File,取名叫做CMakeLists.txt,点击ok。加上以下代码:

cmake_minimum_required(VERSION 3.4.1)

add_library( # Specifies the name of the library.
             Hello

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/Hello.c )

add_library方法:

  • 第一个参数:Hello,就是lib的名称,之后在gradle中的ndk ModuleName一致
  • 第二个参数暂时不管
  • 第三个参数要与上文中创建的c文件路径和名字完全相同,后缀相同

4、使用cmake配置gradle关联

选择Android视图,在需要构建的module下,右键->Link C++ Project with Gradle->选择CMakeLists.txt的路径,就是上文中创建的CMakeLists.txt,点击ok。

构建完成,可以看到在当前module下的build.gradle文件中多了以下这段话:

externalNativeBuild {
    cmake {
        path 'CMakeLists.txt'
    }
}

这时候再在当前的build.gradle中,android模块,defaultConfig下,添加以下代码:

ndk{
    moduleName 'Hello'
}

这里的moduleName就是要与CMakeLists.txt中定义的libraryName一致,这里加入叫Hello吧。

到此基本配置就算是完成了。下面就开始写代码,先从java调用c开始。

三、Java调用C代码

1、定义Java方法

到这一步,终于回到熟悉的Java代码,我们在对应的包名中创建一个类,例如取名叫做Hello,加入一个简单的本地方法,只比普通抽象方法多了一个native关键字,如下:

public native String stringFromC();

2、定义C方法

这时候这个方法是找不到的,还需要在之前的Hello.c文件中写上对应的方法,如下:

#include<jni.h>

jstring Java_net_arvin_androidstudy_jni_Hello_stringFromC(JNIEnv *env, jobject instance) {
    return (*env)->NewStringUTF(env, "I am from c!");
}

代码不长,以此来解释,首先必须要引入的是jni.h,下边的JNIEnv和jstring,jobject等都是在这里边去定义的。

函数的申明部分,jstring表示在java中定义的String,这个位置也就是返回值,然后Java_net_arvin_androidstudy_jni_Hello_stringFromC这一部分看起来很长其实就是三个部分:Java_类的完全限定名_方法名,只是完全限定名中的点改为了下划线,后边的两个参数env和instance,env是一个环境,用它可以操作Java类,创建字符串之类的;instance就是当前调用这个代码的类的实例,这里就是Hello类的实例。

最后就是函数的实现内容,这里是返回一个字符串然后,看一看env这个变量的类型,JNIEnv的定义可以看到是一个typedef const struct JNINativeInterface* JNIEnv;。本身就是指针,然后在方法中的env又是指针,相当于二级指针,所以调用的时候使用的就是(*env)->函数。

3、Java代码与C代码关联

回到Hello类中,在类中加一段静态初始化的代码:

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

其中Hello是上文中在build.gradle中ndk下配置的moduleName。

到这里就可以在其他地方创建Hello类的实例,然后调用stringFromC的方法了。

例如:

Hello jni = new Hello();
System.out.println(jni.stringFromC());

就会在run tab下看到I am from c!这样一句话的输出。

至此Android JNI开发系列之配置就告一段落了。当然后边肯定还有进一步的配置学习,例如需要引入多个c文件,需要引用其他c++库等,肯定也是需要配置的,那些都会在之后的文章中讲到。

感谢

借鉴官方教程

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

推荐阅读更多精彩内容