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


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM