欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-12-02 17:49:28
前言 android上层应用使用java开发,不过java并不适合密集型运算,比如图片处理等,遇到密集型运算,一般使用c/c++完成。 java虚拟机支持调用c/c++...

前言

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开发之 JNI 篇的简单示例

点击应用,安装完后重启android studio即可。

也可以从官网下载,然后在android studio中设置,这种方式不再讲述。

jni开发

本章中以高斯模糊图像处理为示例,学习如何进行jni开发。

1、新建一个android工程,注意android studio对包名的处理,它的默认处理非常地别扭,如果不喜欢这种包名命名方式,可以点击 edit 进行更改。

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

2、将工程以project视图显示,方便查找具体文件。

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

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方法

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

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

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

注意:在弹出创建 jni 文件夹的对话框中勾选 change folder location,并在下面输入文件夹名,如下图所示。

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

一般来说jni相关文件放在 src/main/jni 之中。

9、新建c文件,实现对应接口,在java代码中完成 jni 接口调用。

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

结语

在gradle构建的过程中有可能出现这样或那样的异常,查看gradle构建日志,即可知道具体异常,而查看gradle构建日志按钮比较隐蔽。

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

比如说,使用c文件或c++文件,往往会有一些不同,使用c++文件可能编译报错,此时则需要打开gradle console查看具体原因。

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