在我们的c++代码写好后,我们往往会需要打包成so文件给别人使用,那就要求我们知道如何把c++代码打包成so文件,这里介绍NDK打包的方式
-
1.创建android工程
-
2.关联NDK
-
3.声明native方法,并创建头文件和C++文件
-
4.创建Android.mk文件和Application.mk文件
-
5.打包so文件
1.2属基本准备工作不再赘述,项目别忘关联ndk就行(注意不是sdk)
3:首先声明一个native方法
public class JNIUtils {
public native static String stringFromJNI();
}
然后切换到java文件夹下
然后执行javac指令生成.class文件
然后执行javah指令生成.h头文件
然后创建.cpp文件,引入.h头文件及里面的方法
然后创建 jni文件夹(与java文件夹同级),里面放置Android.mk,Application.mk,.h头文件,.cpp文件,四个东西。
其中,Android.mk文件如下
# Android.mk必须以LOCAL_PATH开头,注释#除外
# 设置工作目录,而my-dir则会返回Android.mk文件所在的目录
LOCAL_PATH := $(call my-dir)
# 借助CLEAR_VARS变量清除除LOCAL_PATH外的所有LOCAL_<name>变量
include $(CLEAR_VARS)
# 设置模块的名称,即编译出来.so文件名
# 注,要和上述步骤中build.gradle中NDK节点设置的名字相同
LOCAL_MODULE := native-lib
# 指定参与模块编译的C/C++源文件列表,多文件用"\"隔开
LOCAL_SRC_FILES := JNIUtils.cpp
# 必须在文件结尾定义编译类型,指定生成的静态库或者共享库在运行时依赖的共享库模块列表。
# BUILD_SHARED_LIBRARY 共享库,供java或者其他共享库调用
# BUILD_STATIC_LIBRARY 静态库,供共享库调用,不能直接被java调用
include $(BUILD_SHARED_LIBRARY)
Application.mk
# 最常用的APP_ABI字段:指定需要基于哪些CPU平台的.so文件
# 常见的平台有armeabi x86 mips,其中移动设备主要是armeabi平台
# 默认情况下,Android平台会生成所有平台的.so文件,即同APP_ABI := armeabi x86 mips
# 指定CPU平台类型后,就只会生成该平台的.so文件,即上述语句只会生成armeabi平台的.so文件
# APP_ABI := armeabi armeabi-v7a mips x86
APP_ABI := all
APP_PLATFORM := android-23
以上两个文件根据需求自行更改
然后build.gradle文件中配置
defaultConfig {
...
ndk{
//模块名称,即编译的.so文件名
moduleName "native-lib"
//"log"表示加入Android的调试日志,只要再导入#include <android/log.h>
//就可以使用__android_log_print方法打印日志到logcat中
ldLibs "log"
}
}
注意so库的名称保持一致
第五步,生成.so文件
Terminal(或cmd)切换至jni文件目录,执行ndk-build即可
so库的调用
public class JNIUtils {
/**
* 加载生成的so库文件
* **/
static {
System.loadLibrary("native-lib");
}
/**
* java调C中的方法都需要用native声明且方法名必须和c的方法名一样
* **/
public native static String stringFromJNI();
}