免费空间 网站,云南省昆明市做网站的公司,wordpress的搭建教程 pdf,营销模式有哪些 新型Android 高级开发 JNI NDK 介绍与使用 前言
对于没接触过的领域#xff0c;即是挑战也是机遇#xff0c;不仅能够提升自己的能力。还能够学习到新的技术知识
而学习新的技术的时候#xff0c;最好是从头开始按照体系学#xff01;比一直找快速解决的方法更好
看技…Android 高级开发 JNI NDK 介绍与使用 前言
对于没接触过的领域即是挑战也是机遇不仅能够提升自己的能力。还能够学习到新的技术知识
而学习新的技术的时候最好是从头开始按照体系学比一直找快速解决的方法更好
看技术资料的同时一定要首先去看官方最新的文档因为可能因为 IDE 的升级 会有不同的使用配置更新
在Android studio中开发NDKNDK是Android底层的 一套开发工具包 c/c库然而要在java中调用c/c的原生功能则需要使用JNI来实现。
什么是JNI
JNI (Java Native Interface) 是java本地接口它主要是为了实现 Java 调用c、c等本地代码所封装的一层接口。大家都知道java是跨平台开发语言它的狂平台特性导致与本地交互的能力不够强大一些和操作系统相关的特性Java无法完成所以Java提供了JNI用于和Native代码进行交互。通过JNIJava可以调用c、c相反c、c也可以调用Java的相关代码。
JNI 实现 Java 调用 C 层的方法流程
图引用来自JNA和JNI的对比
为什么要使用 JNI
通过JNI 技术可以拓展手机Wifi热点coder 执行高效 大量的运算极品飞车 万能解码ffmpeg Opengl3D渲染代码的复用ffmpegopencv人脸识别库 7-zip
#include com_atguigu_jnitests2_JNIS.h
JNIEXPORT jstring JNICALL Java_com_atguigu_jnitests2_JNIS_helloJNI
(JNIEnv * env, jobject jobj) {
return (*env)-NewStringUTF(env, Hello from C);
}
怎么用Jni
学习C语言-看懂代码
熟悉 Jni开发流程在Android 熟悉使用 NDK
NDK介绍
定义Native Development Kit是 Android的一个工具开发包 NDK是属于 Android 的与Java并无直接关系
作用快速开发C、 C的动态库并自动将so和应用一起打包成 APK
即可通过 NDK在 Android中 使用 JNI与本地代码如C、C交互
应用场景在Android的场景下 使用JNI
即 Android开发的功能需要本地代码C/C实现
JNI 是一种协议相当于桥梁作用
Java Native Interface java 本地开发接口
通过JNI 可以让 java 与 C/C 代码实现互调
NDK 是Google 在Android 中提供的开发工具包
使用 NDK 编译代码主要有三种方法
基于 Make 的 ndk-build。CMake。独立工具链用于与其他编译系统集成或与基于 configure 的项目搭配使用。
NDK开发流程
1、在java 里面编写 native 代码
2、在main 目录下创建 jni 目录 / 或者 cpp 文件夹 在内创建 .c 或.cpp 类文件 也就是 c/c文件 可使用命令 生成头文件 CMake 方式的话默认创建项目不会生成头文件
3、配置动态链接库的名称
4、加载动态链接库
5、进行使用
NDK 常用的两种方式 nkd-build 和 CMake 编译代码的两种流程安装配置略有差异。 NDK开发流程 ndk-build 构建
1.安装配置NDK
1). 解压NDK的zip包到非中文目录
2). 配置path : 解压后NDK的根目录-----ndk-build
2. 给AS配置关联NDK
1). local.properties中添加配置
ndk.dirG:\android-ndk-r10
2). gradle.properties中添加配置
android.useDeprecatedNdktrue
3. 编写native方法:
public class JNIS {public native String helloJNI();
}
4.定义对应的JNI
1). 在main下创建jni文件夹
2). 生成native方法对应的JNI函数声明头文件: 命令窗口中, 进入java文件夹
执行命令: javah com.atguigu.jnitests2.JNIS生成头文件: com_atguigu_jnitests2_JNIS.h函数声明: JNIEXPORT jstring JNICALL Java_com_atguigu_jnitests2_JNIS_helloJNI(JNIEnv *, jobject);4.1 生成头文件的两种方式
1.在\NDKDemo\app\src\main\java
执行命令javah com.atguigu.ndkdemo.JNI 拷贝全类名在文件中的 Class 名称右键 - copy Reference 得到 com.thisfeng.ndkdemo2.JNI
生成的 .h头文件 会在当前 java 目录将其拷贝进 jni 目录 或者 cpp 目录和 C文件统一存放
其实在 CMake 构建的话可以不生成头文件直接可以通过IDE 快速创建 C 对应的方法
2.另外一种是在项目的build/intermaediates/classes/debug/下执行
命令 javah -classpath . -jni 类路径 JNI类
3). 将生成的头文件转移到jni文件夹下 AS CMake 构建的 方式应该统一存放在 cpp 文件目录
4). 在jni下定义对应的函数文件: test.c
#include com_atguigu_jnitests2_JNIS.hJNIEXPORT jstring JNICALL Java_com_atguigu_jnitests2_JNIS_helloJNI (JNIEnv * env, jobject jobj) { return (*env)-NewStringUTF(env, Hello from C); } 5). 在jni文件夹下创建一个空的C文件: empty.c
说明: 这是AS的bug, 必须至少2个C文件才能通过编译如果出现可尝试
5. 指定编译的不同CPU
defaultConfig {ndk{moduleName HelloJni //so文件: libmoduleName.so CMake 方式可不 定义 但是会在 CMakeList 中去配置abiFilters armeabi, armeabi-v7a, x86 //cpu的类型}}编译生成不同平台下的动态链接文件 1). 执行rebuild, 生成so文件 2). so文件目录: build\intermediates\ndk\debug\lib… 调用native方法: 1). 在native方法所在的类中加载so文件
static {System.loadLibrary(HelloJni);} 2). 在Activity中调用native方法:
String result new JNIS().helloJNI();Log.e(TAG, resultresult);至此完成 ndk-build 的编译方式 配置到使用如上。下面来说下 NDK开发流程 CMake 构建
1. 介绍 Android NDK 支持使用 CMake 编译应用的 C 和 C 代码。 目前在 AS 中新创建的C/C项目都是基于 CMake 进行构建的 下面记录如何将 CMake 用于 NDK。 目前不支持在同一模块中同时使用 CMake 和 ndk-build。 Android Studio 从2.2 版本起开始支持CMake ,可以通过CMake 和NDK 将C/C 代码编译成底层的库然后再配合Gradle 的编译将库打包到APK 中。 CMake 是一个跨平台构建系统在Android Studio 引入CMake 之前它就已经被广泛运用了。 2. 安装和配置 NDK 和 CMake 点击官网查看 注意如果您在 ndk-bundle 文件夹中安装了 NDK它会显示在标签为 NDK 的列表中。如果您使用的是 Gradle 3.5 版或更高版本则可以选中或取消选中该复选框。取消选中该复选框会卸载已安装的 NDK释放磁盘空间并使复选框从列表中消失。如果您卸载旧版 NDK请从项目的 local.properties 文件中移除 ndk.dir 值该值现已弃用。 3. 配置 CMake 点击官网查看 CMake 构建脚本是一个纯文本文件您必须将其命名为 CMakeLists.txt并在其中包含 CMake 构建您的 C/C 库时需要使用的命令。如果您的原生源代码文件还没有 CMake 构建脚本您需要自行创建一个并在其中包含适当的 CMake 命令。 当你下载了 NDK 和 CMake 配置之后 最好 手动去创建一个 C/C项目 会得到一个完整的默认配置。
4. 将 Gradle 关联到您的原生库
build.gradle 文件中引用 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}}}
5. 遇到的问题
如果您不小心卸载过之前的旧版 NDK请从项目的 local.properties 文件中移除 ndk.dir 值该值现已弃用。
否则会直build 报错不通过是因为。找原来的 NDK 去了
报错如下:
A problem occurred configuring project :app. \ NDK not configured. Download it with SDK manager. Preferred NDK version is 20.0.5594570. Log: /Users/thisfeng/Android/MyDemos/NewNDKDemo2/app/.cxx/ndk_locator_record.json 所以要使用下载 特定的 NDK(side by side)
这个意思是 需要你安装 指定版本的 NDK version is ’20.0.5594570’ 如上图 所示点击 右下角 show Packge details .
而使用 ndk-build 方式 在 as 中 AS NDK一定要配置 local.properties 文件 配置
ndk.dir/Users/thisfeng/Library/Android/sdk/ndk-bundle 并且 3.5 之后 一定要 在 local.properties 文件中移除 ndk.dir 值该值现已弃用。
两种构建方式脚本文件对应:
CMake CMakeLists.txt
ndk-build Android.mk
注意AS 如果老版本的 NDK 被弃用Obsolete了后 需要使用新的。重新下载主要要用梯子更新 CMake 构建生成的 .so 文件 在此。 在安装时 会自动打进 apk包
.so 文件是动态库一般第三方SDK 接入时都需要在 libs 引入对应不同架构的 .so 文件此文件就是第三方SDK内部所使用到的一些和C/C的函数交互库
.a 文件是静态库 有些第三方会提供一个头文件 和 .a 的静态库给你一脸懵逼的不知道如何使用
(cmake配置.a库) 以上是 两种构建方式现在默认官方创建新的 C/C项目的都是用 CMake 进行构建建议采用 CMake 。