博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android NDK系列(一)-AS使用javah生成so文件
阅读量:4165 次
发布时间:2019-05-26

本文共 1436 字,大约阅读时间需要 4 分钟。

NDK,全称Native Development Kit。当jdk无法满足开发或者对效率要求比较高,比如音视频处理,这时候使用NDK就比较合适,废话不多说。直接开始撸、

1、创建一个工程项目

这里写图片描述

2、创建一个library module,便于之后将so文件导入其他工程使用。当然导入其他工程可以只导入so文件,通过system.loadlibrary导入库。也可以将so文件和对应java文件封装成jar包导入,这样就可以直接调用。一般我们导入三方都是使用第二种方式,不过在做ndk开发的时候,第一种也是常见的。

这里写图片描述

3、配置ndk开发环境

首先生成so文件就需要AS有ndk的支持。安装ndk可以自行下载ndk插件,也可以通过AS下载安装。我的电脑使用AS自行下载的ndk-bundle,总是会出问题,这里我就给出一个百度云下载ndk的地址,我用的就是这个成功的。不过AS下载我也给出示例。

这里写图片描述

如图操作

这里写图片描述

或者是使用Android SDK 下载NDK。

这里写图片描述

这个是下载系统提供的ndk-bundle。我虽然下载了,但是我的AS无法使用,好吧, 我很无语,于是去官网下载了,我放在了百度云里,这里我给出下载地址:链接: 密码:d66h

下载成功后,一般放在sdk目录下,当然也可以自己随便下哪。最后在Android sdk location修改路径。

这里写图片描述

嗯,到这里可能差不多了,不过还是要检查一下local.properties文件中是否已经生成ndk.dir路径。

这里写图片描述

这里生成了ndk.dir就没问题了。

那么继续配置环境,需要在gradle.properties设置android.useDeprecatedNdk = true。

这里写图片描述

嗯,到这里就差不多了。

4、编写java文件native方法,调用C逻辑。这里调用System.loadLibrary(“nativeUtil”);,nativeUtil是so文件库的名称。

这里写图片描述

5、使用javah生成class文件,然后生成so文件。首先生成一个jni文件夹。

这里写图片描述

之后在使用javah生成class文件,使用cmd可以,也可以使用AS提供的Terminal。

这里写图片描述

这里写图片描述

这里写图片描述

这里生成一个h头文件,将h头文件放在生成的jni文件夹下(在project模式下),在Android模式下放在cpp下。

6.在cpp文件下(project模式下,在Android模式下是cpp文件夹)创建一个c文件,取名随意。把刚刚生成的h文件引入C文件。同时将h文件生成的方法copy过来。然后写成方法,返回一个jstring类型。使用env生成一个jstring(JNI方法,这里我给出一个我学习使用的Jni文档,有什么需求自己查文档)链接: 密码:dy83

这里写图片描述

7、生成so文件,并调用so的方法。首先将library依赖到app。然后调用library的方法。

这里写图片描述

当然最后不要忘了配置library的gradle,设置生成ndk的名称,以及需要生成的平台。

这里写图片描述

然后就是调用了,最简单的一步。

这里写图片描述

好啦,已经完成了配置和文件的书写,点击运行就会生成so文件,并且能够调用方法,获得返回值。

这里写图片描述

在看看生成的so文件。

这里写图片描述

好啦,使用javah生成so文件的步骤就是这样了。按照这个步骤做就能成功,ndk是一条进阶之路,我也看了网上很多的博客和官网资料还有视频教学,才慢慢入门,希望大家不要放弃,入门之后就是一片光明。还有一种方式AS Cmake,我会在下篇ndk进行介绍。觉得有用的给个赞,谢谢~

你可能感兴趣的文章
Oracle中将毫秒数转换为timestamp类型的两种方法
查看>>
mybatis配置and rownum< minus 查询第几行到第几行数据的sql原型和mybatis原型。
查看>>
oracle的concat函数使用问题。
查看>>
eclipse编辑状态下怎样让指定行左移或右移?
查看>>
plsql developer如何导入导出表结构和数据以及如何复制表结构和数据?
查看>>
oracle如何去除某个字段中两边的空格?
查看>>
plsql developer如何在窗口列表直接可以修改表格中的数据?
查看>>
java自定义注解有什么作用?
查看>>
ORACLE中通过SQL语句(alter table)来增加、删除、修改字段
查看>>
js的Object对象如何访问中间有 . 点号的属性(键),获得其值?
查看>>
@ManyToOne和@OneToMany 注解
查看>>
Java集合(1) - List集合源码解析
查看>>
Java集合(2) - Map与AbstractMap源码解析
查看>>
Java集合(3) - HashMap源码解析与常见问题(一)
查看>>
Java集合(4) - HashMap-put()源码解析与常见问题(二)
查看>>
Java集合(5) - HashMap查删源码解析与常见问题(三)
查看>>
Java集合(6) - LinkedHashMap源码解析
查看>>
Java集合(7) - TreeMap源码解析
查看>>
Java集合(8) - Set与AbstractSet源码解析
查看>>
Java多线程(2) - 多线程之线程安全详解(synchronized、Lock)
查看>>