注意:本人是初学Android开发,Android studio开发环境也是第一次使用,在本文及Android开发系列文章中均为本人个人的见解及网络资料,为自己的学习笔记,同时给初学者提供参考,不正确之处还望包含指正!
前言
本文是在《Android studio使用JNI实例(1)》的基础之上完成的。
外部so库在Java下没办法直接调用(个人意见,至少本人不知道直接调用的办法),所以要使用so库需要添加Java调用接口,即再次将so库的接口封装为Java可以调用的接口,即就是Native方法。
注意:
本文介绍的方法需要将so库封装到APK中,否则无法在调试时运行。
据网上资料介绍,在线调试及ADB调试安装的APK与将APK封装到Android系统镜像中(此时安装系统是会自动安装)这两种方法安装的APK权限不一样。在线调试安装的APK如果依赖so库,就算该so库在系统库(/system/lib路径下)中存在APK也不能直接使用,如果不封装到APK中APK会运行出错(找不到so库文件),应该是Android为了安全而限制的,而封装到Android镜像中的APK可以不用封装so库到APK而直接使用系统库下的so库,本文介绍的使用在线调试,所以使用的将so库封装到APK中,第二种方法在本文中不做介绍,本人目前也没有验证。
调用外部库
本实例的目的是在Android的APK中调用外部so库,其结果与《Android studio使用JNI实例(1)》效果一样,在Android中显示一段字符串,不同的是本例中的字符串来自so库。
生成库文件
首先生成可以在对应平台上运行的so库文件,本文实例运行在全志H6平台,是ARM体系结构,所以需要交叉编译。这些基本的不在赘述,对做Linux开发及嵌入式开发的程序猿都很基础。
本文不介绍生成Android平台so库的方法,也许直接交叉编译生成的库可以使用(本人没验证),为了防止出现不必要的问题,本人在Android源码编译环境中编译so库,此处只贴出库源码,不介绍生成库的方法,可以参考网路上的资料,也可以关注本人博客后期文章,后期本人会整理在Android源码环境下生成so库的方法。
生成名为libhello.so的库文件,其源码(hello.c)如下:
static const char *hello_string = "Hello, I'm library";
const char *hello_hello()
{
return hello_string;
}
该库只有一个借口函数hello_hello(),其功能是返回存在静态去的字符串“Hello, I’m library”的地址,需要将其显示在屏幕上。
新建工程
由于本例是《Android studio使用JNI实例(1)》的升级,是在此基础上完成调用so库的操作,所以先参考《