Android Studio NDK环境搭建及简单示例开发

为什么要使用JNI

JavaNative Interface (JNI)标准是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互操作。
我们先来看Android源码的使用,Android框架里所提供的MediaPlayer.java类,含指令:

public class MediaPlayer{
  static {
    System.loadLibrary("media_jni");
     }
}

这要求VM去载入Android的/system/lib/libmedia_jni.so档案。载入.so之后,Java类与.so档案就汇合起来,一起执行了。

NDk的介绍如下:

NDK是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。它集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。它可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。


接下来我们就尝试开发我们第一个简单的NDK工程

1.NDK环境配置

  • Android Stdio 2.3.2
  • Android NDK 14
  • Java version 1.7
  • Mac os 10.12.3

Android Studio—>Appearance&Behavior–>System Setting –>Android SDK–>SDK Tools

Androidstudio下载界面

此时在local.properties文件中可以看到NDK的路径:
ndk.dir=/Users/beifeng/Library/Android/sdk/ndk-bundle
sdk.dir=/Users/beifeng/Library/Android/sdk

2.环境配置好后我们新建一个项目,然后新建一个类JniHello

public class JniHello {
  //使用静态代码块来加载相应的so文件

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

  //声明一个native方法
  public native String sayHelloWorld();
}

接下来我们使用build中的make Project构建项目,构建项目成功后。注意Test\app\build\intermediates\classes\debug 目录。

构建好的.class文件

3.构建项目成功后,根据生成的class文件,利用javah生成对应的 .h头文件。

然后接下来的步骤就是根据生成的class文件,利用javah生成对应的 .h头文件。在AS的Terminal中:
cd命令进入到该/Users/beifeng/Downloads/GitHub/MyNDK/app/src/main/java
然后执行命令:javah -d jni com.beifeng.myndk.JniHello
-d jni 表示将在当前目录下生成一个header文件夹,产生的头文件就在这里面了。

之后我们就可以在项目目录中看到编译完成的jni文件以及里面的.h的头文件。必须要将jni文件移至main文件目录下,与java文件同级目录(不然在运行时无法生成.so文件)

头文件

4.在jni文件下新建一个c文件(本文中定义为JniHello.c),并且在该c文件中实现上图右侧中所标记的函数,相应代码如下:

#include "com_beifeng_myndk_JniHello.h"

JNIEXPORT jstring JNICALL Java_com_beifeng_myndk_JniHello_sayHelloWorld
  (JNIEnv *evn, jobject obj){
  //  要执行的代码
  //  输出Helloworld
  char *hello= "hello world jni";
  (*evn)->NewStringUTF(evn,hello);
  }
JniHello.c

5.配置Android studio gradle中关于ndk的支持

  • 在gradle.properties文件中添加如下一行代码:android.useDeprecatedNdk=true
  • app的build.gradle文件,在defaultConfig节点里添加如下:
    ndk {
    //需要生成的so文件名称
    moduleName "hello"
    //适配各种架构的cpu
    abiFilters "armeabi", "armeabi-v7a", "x86"
    }

6 .以上设置完成之后,点击Build的Rebuild Project进行重新构造,就可以生成我们自己的的.so文件了。

so文件.png

7.最后在我们的Activity中进行调用

public class MainActivity extends AppCompatActivity {

  private TextView text_tv;

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //调用native方法的类
    JniHello jniHello = new JniHello();   
    text_tv = (TextView) findViewById(R.id.textview);
    text_tv.setText(jniHello.sayHelloWorld());
    Toast.makeText(this, jniHello.sayHelloWorld(), Toast.LENGTH_SHORT).show();
  }
}

至此我们完成了最简单的NDK工程开发。


参考:http://m.blog.csdn.net/article/details?id=51476144

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

推荐阅读更多精彩内容