`
珍惜当下-不恋过往-不惧未来
  • 浏览: 2254 次
  • 性别: 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 Studio下进行NDK开发

    Android Studio NDK开发概述 Android Studio NDK开发是指在Android Studio中使用NDK(Native Development Kit)来实现native代码的开发。NDK是一个本地开发的“工具包”,它可以帮助开发者在Android应用中使用C/...

    非常强大的eclipse中android ndk开发环境的配置说明

    本文档将详细介绍如何在Eclipse中配置Android NDK开发环境,并实现C/C++代码的自动编译以及通过Eclipse使用Ant生成JNI所需的头文件。配置流程包括Linux和Windows两种环境下的步骤。 #### 二、配置前提 确保以下工具...

    ndk开发指南

    在Android NDK开发中,JNI是Java与C/C++通信的关键桥梁。开发者需要编写JNI接口,这些接口定义了Java层与本地代码的交互方式。在C/C++代码中,通过JNI函数调用Java方法,反之亦然。 ### 3. NDK的优点与应用场景 - ...

    Android NDK开发轻松入门.pdf

    - **工作原理**:NDK 主要通过 JNI(Java Native Interface)技术来实现 Java 代码与本地 C/C++ 代码之间的通信。在 Java 代码中声明的方法前加上 `native` 关键字表示该方法由 C/C++ 实现。C/C++ 代码通常位于项目...

    Ndk和JNI资料和环境搭建

    **Android NDK与JNI:深度理解与环境配置** 在Android应用开发中,有时我们需要利用C或C++等原生代码来提升性能或者调用特定硬件功能,这时就涉及到Android Native Development Kit (NDK) 和Java Native Interface ...

    android ndk 开发

    在Android NDK开发过程中,`Android.mk`文件扮演着极其重要的角色。它主要用于描述开发者希望编译进系统的资源,通过特定的语法,可以将这些资源打包成模块(`modules`)。在`Android.mk`文件中定义的模块主要有两种...

    ndk cygwin Jni编程 android

    而Cygwin则为Windows环境下搭建NDK开发环境提供了便利。 #### 二、NDK简介 **NDK**(Native Development Kit)是Google提供的用于开发Android原生应用程序的一套工具集。它允许开发者使用C或C++来编写Android应用...

    Eclipse下NDK开发参考

    ### Eclipse 下 NDK 开发指南 #### 概述 本指南旨在为开发者提供关于如何在 Eclipse 开发环境中利用 Android NDK 进行开发的基础指导。Android NDK 是一套工具集,允许开发者使用 C 和 C++ 等原生代码语言来实现...

    Android NDK基础开发

    Android NDK(Native Development Kit)是Google为Android平台提供的一款工具集,允许开发者在Android应用中使用C++和其它...不过,NDK开发也需要对C/C++编程和Android系统有深入理解,实践中应结合具体需求灵活运用。

    android ndk 开发实例

    ### Android NDK 开发实例详解 #### 一、概述 Android NDK (Native Development Kit) 是一套工具集合,允许开发者使用 C 或 C++ 编写应用程序的部分或全部代码。这在需要高性能计算的情况下非常有用,比如游戏开发...

    android+NDK 开发.pdf

    #### 三、NDK开发流程概述 1. **环境搭建**:首先需要安装Android SDK和NDK工具包。此外还需要配置好交叉编译工具链以及其他必要的开发工具。 2. **创建项目**:使用Android Studio或其他IDE创建一个新的NDK项目...

    Android_NDK开发入门示例

    #### 一、Android NDK 概述 Android NDK (Native Development Kit) 是一套工具集,它允许开发者使用 C 或 C++ 编写原生代码来构建 Android 应用程序。这为需要高性能计算的应用(如游戏和其他性能密集型应用)提供...

    android studio NDK例子

    本示例库"android-ndk-master"提供了丰富的Android Studio NDK开发案例,帮助开发者深入理解和掌握NDK的使用。 一、NDK概述 1.1 NDK是什么:NDK是Native Development Kit的缩写,它是Google官方提供的一个工具包,...

    NdkDemo.rar

    《Android NDK开发详解——基于NdkDemo实例》 在移动应用开发领域,Android Studio作为主流的集成开发环境,提供了丰富的工具和功能,使得开发者能够更高效地构建应用程序。而NDK(Native Development Kit)是...

    windows下安装NDK开发工具

    此外,NDK 还支持与 Java 层的交互,使得开发者能够在同一个应用中同时使用 Java 和 C/C++ 代码。 #### 二、下载 Android NDK 1. **访问官方页面**:首先,你需要从 Android 官方网站下载最新的 NDK 版本。可以...

    android jni

    #### 五、使用NDK开发流程 1. **创建项目**:使用Android Studio创建一个新的项目。 2. **配置build.gradle**:设置项目的构建方式,指定使用NDK。 3. **编写C/C++代码**:在项目中添加C/C++源文件。 4. **生成JNI...

    NDK Google android ndk

    #### 四、NDK开发实践 1. **配置环境**:首先运行`build/host-setup.sh`来配置NDK环境。 2. **组织代码**:将C/C++代码放在`sources/<mysrc>`目录下。 3. **编写Android.mk文件**:在`sources/<mysrc>`目录下创建...

    hello-jni.rar_ android jni_android hello jni_android jni hellojn

    《Android NDK与JNI开发详解:从Hello-JNI入门》 Android系统以其开源性和灵活性吸引了大量的开发者,而JNI(Java Native Interface)则是Android平台中连接Java层与原生C/C++代码的重要桥梁。JNI允许开发者在...

Global site tag (gtag.js) - Google Analytics