`
珍惜当下-不恋过往-不惧未来
  • 浏览: 2176 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

JNI与NDK开发概述

阅读更多

 

 

一. JNI与JDK概述

1. JNI是什么?

  • Java Native Interface,即Java本地开发接口
  • 一种协议,在Java和C或C++之间相当于桥梁作用
  • 可以实现Java调用C或C++代码,也可实现C或C++调用Java代码

2. JNI有何用?

  • 可以扩展Android手机的功能,如WIFI热点、NFC等
  • C或C++代码(native code)执行比较高效:大量计算、万能解码(ffmpeg)和3D渲染(OpenGL)等情况
  • 代码的复用:ffmpeg、onencv(人脸识别)、7-zip等
  • 软件或系统的增量升级时,即需要使用JNI技术
  • 使用场景:要时刻考虑特殊情况(效率/操作硬件)

3. JNI怎么用?

  • 学习C语言
  • JNI开发流程:NDK
    • NDK(Native Develop Kits),即本地开发工具包
    • Android提供的用于进行JNI开发的工具包
    • 作用:提高JNI开发的效率(生成代码、代码提示、多平台交叉编译)

二、基于Eclipse的NDK集成开发流程

1. 安装配置NDK
1). 解压NDK的zip包到非中文目录下
2). 配置Path环境变量

2. 将NDK关联到Eclipse
Window-->Preferences-->Android-->NDK-->配置NDK的根目录

3. 为当前应用自动生成c文件和mk文件
1). 选中当前应用右键-->Android Tools-->Add Native Support
2). 将生成的.cpp文件改为.c文件
3). 修改mk文件: 将.cpp改为.c

4. 配置关联jni.h
1). 选中当前应用右键-->Properties-->C/C++ General-->Paths and Symbols
2). 选择add-->选择File System-->选择文件夹android-ndk-r9\platforms\android-18\arch-arm\usr\include
3). 点击ok-->点击apply

5. 定义naitve方法
public native String helloNDK();

6. 实现native方法对应的JNI函数
1). 使用javah命令, 生成JNI头文件, 将其复制到jni文件下
2). 在c文件中实现h文件中的函数声明
3). 利用*的NewStringUTF()函数, 返回字符串

7. 一锤编译生成so文件
1). 使用工具栏中的"Build"工具点击锤子按钮生成
2). 文件路径: /libs/armeabi/libNDKTest.so

8. 加载动态库, 并调用native方法

static {  
    System.loadLibrary("NDKTest");  // 加载动态链接库
}  
String result = helloNDK();  // 使用

9. 运行应用安装到ARM模拟器

补充说明:

  • 修改C函数, 不需要再单独编译生成so文件, 可直接运行安装
  • APK只是将so打包了, 本质并不需要jni文件夹下的相关文件
  • 多平台交叉编译(arm、intel和mips)
  • Android.mk详细介绍
    • 编写Android.mk
    • 配置关联jni.h文件
    • 编写Application.mk

三、基于Eclipse的JNI原生开发流程 ##

1. 在Java类中定义native方法

Activity类中声明: public native String helloJNI();  

2. 生成包含对应JNI函数声明的头文件
1). 在命令行窗口中执行: javah Activity全类名(在src下执行)
说明:有的电脑可能会提示GBK的不可映射字符: 添加 -encoding utf-8
2). 在src下会生成一个头文件: com_atguigu_hellojni_MainActivity.h
3). 头文件中包含一个native方法对应的JNI函数声明(需要后面实现)

3. 实现生成的JNI函数
1). 在应用下创建一个文件夹: jni
2). 将刚才生成的头文件复制到此文件夹下
3). 创建一个c文件来实现生成的JNI函数声明: test.c

4. 借助NDK编译生成动态链接库文件(.so)
1). 解压NDK包, 配置NDK文件夹到path(不能包含空格) 2). 借助NDK下的文档(ANDROID-MK.html)编写用于编译的文件(jni/Android.mk)

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := hello-jni #指定生成的so文件的唯一标识
LOCAL_SRC_FILES := test.c  #指定包含JNI函数的c文件名
include $(BUILD_SHARED_LIBRARY)

3). 在命令行窗口中进入应用根目录, 执行ndk-build命令, 生成so动态链接库文件(so文件路径: /libs/armeabi/libhello-jni.so)

5. 在Java类中加载动态连接库并调用native的方法

// 1). 在静态代码块中加载so文件:
static {
    System.loadLibrary("hello-jni");
}
// 2). 调用native方法:
String result = helloJNI();

6. 运行安装到ARM模拟器上

补充说明:
JNIEXPORT:在Jni编程中所有本地语言实现Jni接口的方法前面都有一个"JNIEXPORT",这个可以看做是Jni的一个标志,至今为止没发现它有什么特殊的用处。
JNICALL:这个可以理解为Jni和Call两个部分,和起来的意思就是 Jni调用XXX(后面的XXX就是JAVA的方法名)。

分享到:
评论

相关推荐

    《Android C++高级编程——使用NDK》_源码.zip

    《Android C++高级编程——使用NDK》提供了Java原生接口(JNI)的概述、Bionic API、POSIX 线程和套接字、C++支持、原生图形和声音API以及NEON/SIMD优化,在一个游戏应用案例的帮助下,你将学到很多关键技能。...

    记录Android studio JNI开发的三种方式(推荐)

    在Andorid Studio不支持JNI开发之前大家一般都是使用Eclipse开发JNI,各种配置让人觉得很蛋疼。从Andorid Studio支持JNI开发后,让我们开发JNI变的如此简单。 NDK 和 JNI介绍 JNI (Java Native Interface)是一套编程...

    《Android应用开发揭秘》附带光盘代码.

     16.2 安装和配置NDK开发环境  16.2.1 系统和软件需求  16.2.2 NDK开发环境搭建  16.2.3 编译第一个NDK程序  16.3 AndroidNDK开发  16.3.1 JNI接口设计  16.3.2 使用C\C++实现本地  方法  16.3 编译C\C++...

    《Android应用开发揭秘》源码

     16.2 安装和配置NDK开发环境  16.2.1 系统和软件需求  16.2.2 NDK开发环境搭建  16.2.3 编译第一个NDK程序  16.3 AndroidNDK开发  16.3.1 JNI接口设计  16.3.2 使用C\C++实现本地方法  16.3 编译C\C++代码 ...

    Android应用开发揭秘pdf高清版

    16.2 安装和配置NDK开发环境 16.2.1 系统和软件需求 16.2.2 NDK开发环境搭建 16.2.3 编译第一个NDK程序 16.3 AndroidNDK开发 16.3.1 JNI接口设计 16.3.2 使用C\C++实现本地 方法 16.3.3 Android.mk实现 16.3.4 ...

    Android 初学中阶高阶书籍_集合打包2

    巧,android_jni操作指南,Android_NDK开发实例,Android_RIL层剖析(官方翻译),Android2.2+API+中文文档系列,Android的 Message机制(简单小结). Android的主题和风格介绍,Android开发环境搭建,Android内存泄露调试,...

    Android 初学中阶高阶书籍_集合打包3

    巧,android_jni操作指南,Android_NDK开发实例,Android_RIL层剖析(官方翻译),Android2.2+API+中文文档系列,Android的 Message机制(简单小结). Android的主题和风格介绍,Android开发环境搭建,Android内存泄露调试,...

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版

    第3章 用JNI实现与原生代码通信 57 3.1 什么是JNI 57 3.2 以一个示例开始 57 3.2.1 原生方法的声明 58 3.2.2 加载共享库 58 3.2.3 实现原生方法 59 3.3 数据类型 64 3.3.1 基本数据类型 64 3.3.2 引用类型 ...

    Android开发艺术探索.任玉刚(带详细书签).pdf

    14.2 NDK的开发流程 478 14.3 JNI的数据类型和类型签名 484 14.4 JNI调用Java方法的流程 486 第15章 Android性能优化 489 15.1 Android的性能优化方法 490 15.1.1 布局优化 490 15.1.2 绘制优化 493 15.1.3 ...

    android开发艺术探索高清完整版PDF

    / 463 13.4 反编译初步 / 469 13.4.1 使用dex2jar和jd—gui反编译apk / 470 13.4.2 使用apktool对apk进行二次打包 / 470 第14章 JNI和NDK编程 / 473 14.1 JNI的开发流程 / 474 14.2 NDK的开发流程 / 478 14.3...

    Android开发艺术探索

    第14章 JNI和NDK编程 / 473 14.1 JNI的开发流程 / 474 14.2 NDK的开发流程 / 478 14.3 JNI的数据类型和类型签名 / 484 14.4 JNI调用Java方法的流程 / 486 第15章 Android性能优化 / 489 15.1 Android的...

Global site tag (gtag.js) - Google Analytics