一、Android NDK开发

二、Android SO库

三、第一个SO库制作

介绍一下如何往已有工程添加SO库。一起动手实践第一个SO库。主要的步骤如下:

3.1 在main目录下新建jni目录

android so库命名 安卓so库_java

3.2 找到项目的gradle.properties,添加一行 android.useDeprecatedNdk=true

android so库命名 安卓so库_java_02

3.3 在jni目录下添加一个空的C/CPP源文件

在这里,我创建了一个空的hello.cpp

android so库命名 安卓so库_java_03

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主要是指定上述二个文件的路径,写法如下:

android so库命名 安卓so库_java_04

3.5 定义java层的native方法,并通过javah生成C++层的函数声明

在java层引用so库,声明native方法,如下所示:

android so库命名 安卓so库_Android_05


3.5.1 配置External Tools。点击File->settings->ExternalTools->点击绿色加号

android so库命名 安卓so库_java_06

配置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

android so库命名 安卓so库_Android_07


生成native方法的C/C++层函数定义。

一般的定义形式为:

JNIEXPORT 返回类型 JNICALL Java_包名_类名_方法名(JNIEnv *env, 原有参数列表...);

方法是:通过对native函数所在的java文件右键NDK->javah,即可生成一个C/C++层函数定义。

如图所示:

android so库命名 安卓so库_函数定义_08


生成的结果:

android so库命名 安卓so库_函数定义_09

3.6 将该声明拷贝到hello.cpp,并删除刚才生成的那个文件,我们就可以实现内部的功能了。

或者不删除,在CPP函数中include这个头文件也行。

android so库命名 安卓so库_Android_10

3.7 Demo

【GitHub-TestJNI-Demo】