最近因为需要要学习Android开发,顺便也看看jni和Ndk,可能以后要在android中用c++代码。
ndk将.c文件编译成so文件需要使用到Android.mk,它指定了在编译的时候要链接和使用的库,以下是最普通的写法:
LOCAL_PATH:=$(call my-dir) //设置需要编译的文件的路径,my-dir代表当前路径
include $(CLEAR_VARS) //这是ndk提供的一个脚本,用于清除上一个模块编译的时候
//用到的带LOCAL前缀(除了LOCAL_PATH)的参数
//如果一个android.mk要编译多个模块,在每个模块编译前都要加上
LOCAL_MODULE := ndktest //模块名字,最后的文件名会在前面加上lib,例如:libndktest.so
LOCAL_SRC_FILES := ndktest.cpp //模块所需要的.c/.cpp文件
LOCAL_LDLIBS := -lm -llog //模块所需要包含的库
include $(BUILD_SHARED_LIBRARY) //这一句使用了ndk的脚本,指明生成的是动态库
再之后若还用到其他语句再在此记录。
在Android Studio中,要想使用Android.mk文件,需要右键模块名,选择Link C++ Project with gradle,
然后在Bulid-system上选择 ndk-bulid ,下面的文件选中刚刚编写的android.mk文件,点击确认。
此时在Android Studio中就可以对c++代码进行补全了,没有用这个之前一直不能补全,好像是这个文件链接后AS自动将c++库包含进了模块中。
最后执行ndk目录下的命令 ndk-bulid 即可生成.so文件,这里我是将ndk-bulid加入了环境变量,所以可以直接使用,没有加入的可以将ndk根目录包含进环境变量,就可以直接使用了。
经过编译后,有下图就是编译成功了:
最后可以在libs下找到so文件,由于并没有在android.mk下指定要生成的是哪种版本的so,所以这里全都生成出来了。