Android Studio开发之 JNI 篇的简单示例

 更新时间:2017年10月21日 14:31:19   作者:某昆  
本篇文章主要介绍了Android Studio开发之 JNI 篇的简单示例,它提供了若干的API实现了Java和其他语言的通信,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

前言

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-sdk\\ndk-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~2\Android\android-sdk\platforms\android-8\android.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查看具体原因。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 详解 Kotlin Reference  Basic Types, String, Array and Imports

    详解 Kotlin Reference Basic Types, String, Array and Imports

    这篇文章主要介绍了详解 Kotlin Reference Basic Types, String, Array and Imports的相关资料,需要的朋友可以参考下
    2017-06-06
  • Android自定义视图中图片的处理

    Android自定义视图中图片的处理

    Android系统提供了ImageView显示普通的静态图片,也提供了AnimationDrawable来开发逐帧动画,还可通过Animation对普通图片使用补间动画。图形、图像处理不仅对Android系统的应用界面非常重要,而且Android系统上的益智类游戏、2D游戏都需要大量的图形、图像处理
    2022-07-07
  • TabLayout使用方法详解

    TabLayout使用方法详解

    这篇文章主要为大家详细介绍了Android中TabLayout的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • android studio3.0以上如何通过navicat访问SQLite数据库文件

    android studio3.0以上如何通过navicat访问SQLite数据库文件

    这篇文章主要介绍了android studio3.0以上如何通过navicat访问SQLite数据库文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • android监听器实例代码

    android监听器实例代码

    在本篇中小编给大家整理了一篇关于android监听器的相关知识点文章,需要的朋友们可以学习下。
    2019-10-10
  • Android自定义viewgroup可滚动布局 GestureDetector手势监听(5)

    Android自定义viewgroup可滚动布局 GestureDetector手势监听(5)

    这篇文章主要为大家详细介绍了Android自定义viewgroup可滚动布局,GestureDetector手势监听,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • Flutter实现倒计时秒数转时分秒然后倒计时功能

    Flutter实现倒计时秒数转时分秒然后倒计时功能

    有一个需求,需要在页面进行显示倒计时,倒计时结束后,做相应的逻辑处理,这篇文章主要介绍了Flutter实现倒计时功能,秒数转时分秒,然后倒计时,需要的朋友可以参考下
    2023-08-08
  • RecyclerView使用详解

    RecyclerView使用详解

    本文主要对RecyclerView的使用进行了详细介绍,文章结尾附上源码下载,具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • Android原生ViewPager控件实现卡片翻动效果

    Android原生ViewPager控件实现卡片翻动效果

    这篇文章主要为大家详细介绍了Android原生ViewPager控件实现卡片翻动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • android异步消息机制 源码层面彻底解析(1)

    android异步消息机制 源码层面彻底解析(1)

    这篇文章主要为大家详细介绍了android异步消息机制,源码层面彻底解析,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09

最新评论