so文件是C、C++的函数库,在Android中 调用这些库,使用的是JNI( Java Native interface)
JNI 可以使Java程序调用本地程序或者库(一般是使用C、C++ 或者汇编语言编写)。
这篇文章 会介绍 使用Android Studio 如何生成so文件,及如何使用so
首先需要配置NDK 的环境,没有环境的同学,自行google或者百度,网上有很多资料。
该类的作用是定义native 接口,如下图,我们定义了一个getKey的native方法
执行gradle clean build 命令,生成class文件
查看 build\intermediates\classes\debug\包名 路径下是否存在JniUtil.class, 如果没有重新build
使用Tirminal或者 终端 切换目录到build\intermediates\classes\debug\ 下执行
javah -jni com.jni.demo.JniUtil (JniUtil类的路径)
会生成com_jni_demo_JniUtil.h 文件,内容如下
这个方法就对应我们在JniUtil类中定义native方法,
4.创建 jni目录
在app/main/ 路径下创建jni目录(与java目录同级),并将上面生成的com_jni_demo_JniUtil.h 文件复制到该目录下
5.创建.c文件
在jni文件中创建 JniUtil.c 文件,编辑内容如下:
6.创建Android.mk和Application.mk文件
在jni目录中创建Android.mk文件,并编辑内容如下:
LOCAL_PATH := $(call my-dir) // 不需要调整(代码所在的目录,jni目录)
include $(CLEAR_VARS) //不需要调整
LOCAL_MODULE := jniutil // 库的名称
LOCAL_SRC_FILES := JniUtil.c // 需要编译的C、C++文件
include $(BUILD_SHARED_LIBRARY)
在jni了目录下创建Application.mk 文件,编辑内容如下:
APP_ABI := armeabi armeabi-v7a x86 // 生成so文件的平台 ,设置为all, 代表所有平台
7.生成so文件
切换到main目录下 执行ndk-build 生成so文件,
,
这里会生成了一个libs文件夹和obj文件及,都有 so文件,我做了测试,obj 文件下的是正确的,这里还没有确定libs文件夹的作用。
1.将我们生成的so文件复制到 app下的libs文件夹下,并配置build.gradle 文件
2.使用System.loadLibrary("jniutil"); 加载so文件,可以将其写在JniUtil类中
当我们调用getKey方法的时候,实际就是调用了so库中的Java_com_jni_demo_JniUtil_getKey 方法
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8