一、Android NDK开发
二、Android SO库
三、第一个SO库制作
介绍一下如何往已有工程添加SO库。一起动手实践第一个SO库。主要的步骤如下:
3.1 在main目录下新建jni目录
3.2 找到项目的gradle.properties,添加一行 android.useDeprecatedNdk=true
3.3 在jni目录下添加一个空的C/CPP源文件
在这里,我创建了一个空的hello.cpp
3.4 在jni目录下添加Android.mk和Application.mk 并在build.gradle添加配置
Android.mk的作用:指定源码编译的配置信息,如如工作目录,编译模块的名称,参与编译的文件等。
LOCAL_PATH := $(call my-dir)
// 设置工作目录,而my-dir则会返回Android.mk文件所在的目录
include $(CLEAR_VARS)
// 清除几乎所有以LOCAL——PATH开头的变量(不包括LOCAL_PATH)
LOCAL_MODULE := helloJni
// 设置模块的名称,即编译出来libhelloJni.so文件名
// 注,要和上述步骤中build.gradle中NDK节点设置的名字相同
LOCAL_SRC_FILES := hello.cpp
// 指定参与模块编译的C/C++源文件名
LOCAL_LDLIBS := -lm -llog
include $(BUILD_SHARED_LIBRARY)
// 指定生成的静态库或者共享库在运行时依赖的共享库模块列表
- 注意,一定不要有空格。
Application.mk的作用:配置编译平台相关内容。
APP_PLATFORM := android-16
// APP_PLATFORM最低支持的AndroidAPI版本
APP_ABI := armeabi-v7a
// 最常用的APP_ABI字段:指定需要基于哪些CPU平台的.so文件
build.gradle主要是指定上述二个文件的路径,写法如下:
3.5 定义java层的native方法,并通过javah生成C++层的函数声明
在java层引用so库,声明native方法,如下所示:
3.5.1 配置External Tools。点击File->settings->ExternalTools->点击绿色加号
配置javah工具
Name: javah
Description: javah
Group: NDK
Program: javah.exe 注意:这里选择javah.exe所在的路径(在jdk安装路径里)
Parameters: -classpath . -jni -encoding $FileEncoding$ -d $ModuleFileDir$/src/main/jni $FileClass$
Working directory: $ModuleFileDir$/src/main/java
生成native方法的C/C++层函数定义。
一般的定义形式为:
JNIEXPORT 返回类型 JNICALL Java_包名_类名_方法名(JNIEnv *env, 原有参数列表...);
方法是:通过对native函数所在的java文件右键NDK->javah,即可生成一个C/C++层函数定义。
如图所示:
生成的结果:
3.6 将该声明拷贝到hello.cpp,并删除刚才生成的那个文件,我们就可以实现内部的功能了。
或者不删除,在CPP函数中include这个头文件也行。
3.7 Demo