Android下Native的so编译:使用ndk-build.cmd/.sh
最近将一个DLL库移植至安卓下,编译出so文件。
经历makefile、cmake等等的入门到放弃.....
最后还是使用android的ndk编译命令来解决
每个NDK文件下,均包含的是所有工具链、头文件、库文件等
执行ndk-build命令,诸如:D:\10.AndroidSDK\ndk\android-ndk-r15b\ndk-build.cmd,则是使用R15版本的NDK编译
ndk-build编译时,会在指定工作目录下查找jni/Android.mk及jni/Application.mk,这两个文件也是标准makefile
Application.mk中定义一个APP下所有的选项,诸如编译几个ABI、编译时使用什么STL
示例:
# 不写 APP_ABI 会生成全部支持的平台,目前支持:armeabi arm64-v8a armeabi-v7a
# APP_ABI := armeabi arm64-v8a armeabi-v7a mips mips64 x86 x86_64
# APP_ABI := all
APP_ABI := arm64-v8a
APP_STL := c++_static
Android.mk则定义一个或多个模块的编译,限定了相应宏来确定模块名、相应源代码文件
示例:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# 要生成的.so库名称。java代码System.loadLibrary("hello");加载的就是它
LOCAL_MODULE := XXXXXX
# C++文件
LOCAL_SRC_FILES := ../src/XXX/AAA.cpp \
../src/XXX/BBB.cpp \
../src/XXX/base64/CBase64.cpp \
../src/XXX/BB/FF.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../inc $(LOCAL_PATH)/../src/XXX
LOCAL_CFLAGS := -DXXX_EXPORT
LOCAL_LDLIBS := -luvc -lusb100 -ljpeg-turbo1500
LOCAL_LDFLAGS := -L$(LOCAL_PATH)/../lib/$(TARGET_ARCH_ABI) -lm -llog
# LOCAL_LDFLAGS := -L$(LOCAL_PATH)/../lib/$(TARGET_ARCH_ABI)-luvc -lusb100 -ljpeg-turbo1500 -lm -llog
include $(BUILD_SHARED_LIBRARY)
LOCAL_MODULE指定的是模块名
LOCAL_SRC_FILES指定相应的源代码文件
其中Android.mk中使用的宏名TARGET_ARCH_ABI,即Application.mk下面APP_ABI的当前项ABI
include $(BUILD_SHARED_LIBRARY)表示编译的是一个共享库
如果想编译多个模块,则应该在include $(BUILD_SHARED_LIBRARY)后面,使用include $(CLEAR_VARS)清除变量,
增加更多模块。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现