最近將一個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)清除變量,
增加更多模塊。