Android Studio开发之 JNI 篇的简单示例
前言
Android上层应用使用java开发,不过java并不适合密集型运算,比如图片处理等,遇到密集型运算,一般使用c/c++完成。
Java虚拟机支持调用c/c++代码,即JNI(Java Native Interface),它提供了若干的API实现了Java和其他语言的通信。为方便android平台上使用JNI技术,提供了NDK开发包,可以将NDK理解为对JNI的进一步封装,方便开发使用罢了。
JNI开发方式有多种,可以在Android 源码中开发,也可以利用其它工具,但都比较烦琐或者要下载很多东西,Android Studio也支持JNI开发,使用起来也比较方便,本文主要讲述下如何使用Android Studio进行JNI开发。
NDK设置
NDK需要下载,一共有两种方式,建议从Android Studio中下载。
从Android Studio中打开SDK Manager,进入如下界面并且勾选NDK选项。
点击应用,安装完后重启Android Studio即可。
也可以从官网下载,然后在Android Studio中设置,这种方式不再讲述。
JNI开发
本章中以高斯模糊图像处理为示例,学习如何进行JNI开发。
1、新建一个Android工程,注意Android Studio对包名的处理,它的默认处理非常地别扭,如果不喜欢这种包名命名方式,可以点击 Edit 进行更改。
2、将工程以Project视图显示,方便查找具体文件。
3、在项目gradle.properties文件中加上以下代码,表示我们要使用NDK进行开发。
android.useDeprecatedNdk=true
4、查看项目local.properties中是否有加入ndk和sdk的路径,如果没有需要补充。
ndk.dir=D:android-sdkndk-bundle
sdk.dir=D:android-sdk
5、在app文件夹下的build.gradle的defaultConfig里加入如下代码
ndk {
moduleName "ImageBlur" //生成的so文件名字,调用C程序的代码中会用到该名字
abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种平台下的so库
ldLibs "log", "jnigraphics", "android" //jni中需要用到的其它库
}
6、定义native方法
7、生成h文件,打开Android Studio提供的命令行工具Terminal,输入以下指令。
cd app/src/main/java
javah -jni 包名+类名
本例中报错,“无法确定Bitmap的签名”,根据网上搜索结果,需要指出 android.jar 文件的位置才行,于是按如下方法生成 h 文件。
复制代码 代码如下:
javah -classpath C:PROGRA~2Androidandroid-sdkplatformsandroid-8android.jar;. com.test.JniTest
8、建立 JNI 文件夹,复制生成的 h 文件到 JNI 文件夹中来。 选择File- New- Folder- JNI Folder
注意:在弹出创建 JNI 文件夹的对话框中勾选 Change Folder Location,并在下面输入文件夹名,如下图所示。
一般来说JNI相关文件放在 src/main/jni 之中。
9、新建c文件,实现对应接口,在java代码中完成 JNI 接口调用。
结语
在gradle构建的过程中有可能出现这样或那样的异常,查看gradle构建日志,即可知道具体异常,而查看gradle构建日志按钮比较隐蔽。
比如说,使用c文件或c++文件,往往会有一些不同,使用c++文件可能编译报错,此时则需要打开gradle console查看具体原因。
以上就是本文的全部内容,希望对大家的学习有所帮助。
- mapreduce项目调优
- zookeeper强制关机无法启动Unable to load database on disk具体解决步骤
- Python爬淘宝——300W淘宝文胸说明了什么
- 文本编码转换工具iconv 附批量转换文件编码命令
- 用23行代码爬取豆瓣音乐top250
- GitHub上超9Kstars的Python爬虫项目——pyspider(国人编写)
- 理解zookeeper选举机制
- zookeeper详解
- Python爬虫进阶(一)使用Selenium进行网页抓取
- R语言的优劣
- 学习SQL【10】-SQL高级处理
- 使用Python操作机器人聊天
- 为 Redis 添加 JSON 数据类型
- 常用markdown命令
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 猿思考系列2——一文搞懂同步并发套路
- 猿思考系列3——一文搞懂单例和思考的套路
- 猿思考系列3——一文学会思考的正确姿势
- 猿思考系列4——一文学会java的斗转星移动
- 猿思考系列5——一文明白java和微商那点儿事儿
- 猿思考系列8——缓存的套路也就这些
- 猿思考系列9——一文获取隐藏逻辑挖掘办法
- 猿蜕变系列1——春天的故事
- 猿蜕变系列2——一文搞懂spring的花式DI
- 猿蜕变系列3——SpringMVC之初体验
- 猿蜕变4——一文获取web框架正确学习套路
- 猿蜕变系列5——一文搞懂Controller的花式编写
- 猿蜕变系列6——一文掌握springMVC必会技巧
- ModuleNotFoundError: No module named ‘__main__.XX‘;
- 猿蜕变系列7——也说说springMVC上传姿势