今天来讲一下Android Studio
集成ndk开发的流程及相应的一些配置,也算是留一个笔记,方便以后查阅。
整个流程大概分为以下几部分:
- 配置
build.gradle
让其支持ndk的编译- 编写
native
方法及加载相应的so
库- 手动编译
c
头文件- 实现
native
方法- 测试
1.配置build.gradle
1.先在build.gradle
文件中配置
在app
的build.gradle
中的defaultConfig
括号内添加以下代码:
ndk {
moduleName "hardcontrol" //生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86" //指定编译的so库所支持的平台
ldLibs "log" //配置log库
stl="system" //系统默认最小支持的c++运行时库
cFlags="-std=c++11" //标记
}
此处配置就相当于我们配置了Android.mk
和Application.mk
这两个文件,由gradle
自动帮我们构建,一般情况下我们只需要配置moduleName
和abiFilters
两个属性就可以了,最多加一个log
库,可以在C
中使用Anroid
的Log
库来打日志,其它两项一般可能用不到。此处可以配置的属性都可以在NdkOptions
中看到,按住command
通过点击任意一个属性就可以进入。
2.在gradle.properties
文件中配置
只需要配置一个参数即可:
android.useDeprecatedNdk=true
2.确认项目支持ndk环境
1.在project sturcture
中查看是否已配置ndk环境:
2.在local.properties
文件中查看相应配置:
ndk.dir=/Users/mac/Android/android-sdk-macosx/ndk-bundle
确认这两处都有配置。
3.编写native
方法并调用so
库
public class HardControl {
public static native int ledOpen();
public static native void ledClose();
public static native void ledControl(int which,int status);
static {
//此处加载的lib库名,需要和build.gradle中配置的moduleName一致
System.loadLibrary("hardcontrol");
}
}
上面的例子中,我们编写了三个native
方法,都是使用静态static
修辞的,这样子可以直接通过类名.方法名来直接调用,如果不用static
修辞也是可以的,那就需要创建对象来访问这些方法,和其它方法访问一样。
4.编译并生成头文件
上面的native方法编写完后,此时,我们需要先编译一下代码,使用clear Project
或者build project
都是可以的,目的是为了让其生成相对应的class字节码文件,然后,使用javah来生成头文件。
编译源码之后,在下面的路径中就能找到生成class字节码的文件。
此时,我们需要使用命令行进入到该目录,使用Android Studio
中的terminal
来执行操作。先用命令进行debug
目录
然后使用javah
命令来生成头文件
javah -jni com.example.mac.testled.hardControl.HardControl
这时需要注意的是:
- 包名路径需要使用
.
而不能使用/
- 选择要编译含有
native
方法的class
文件,并且在编译时,不能带.class
后缀。
执行上面命令成功后,会在debbug
目录下生成头文件。
5.创建jni
目录并编写native
方法的c实现
直接使用Android Studio
提供的创建方式:
然后将生成的头文件拷贝到jni目录下,此头文件是可以重命名的,一般我们会和其对应的c/cpp
文件同名。
头文件就相当于我们java
里的接口,我们还需要对头文件里的方法进行实现。可以使用c或者cpp文件来实现。我们的c
或者cpp
文件的方法名可以直接拷贝我们.h
头文件中的方法名。
下面是我们的头文件中的方法声明:
我们可以直接把上面的三个方法声明拷贝到我们的c/cpp
文件中,稍作修改即可。
接下来,我们在相应的方法体里面写入c代码即可。
7.测试
我们在ledOpen
方法中打印了android
的log
。现在通过调用ledOpen
的native
方法来验证一下其效果。
直接调用该方法,执行后,在log
区打印出来了相应的信息。
8.扩展
1.多文件多native
方法的处理
意思是有多个文件中含有native
方法的处理