2016-09-28 2 views
3

Недавно я обнаружил, что связывание готовых статических библиотек от ndk-build принципиально отличается от того, что из дерева исходных текстов Android (мм). Почему это?Связывание готовых статических библиотек ndk vs. Android-источник

// main.cpp 
    #include <stdio.h> 
    #include "doubler.hpp" 

    int main() 
    { 
     printf("test a static lib \n"); 

     // library function 
     doubler *p = new doubler(); 
     delete p; 

     return 0; 
    } 

Android тк:

LOCAL_PATH := $(call my-dir) 

###################### static lib ################## 
### prebuilt lib works in NDK but not Android src 
#include $(CLEAR_VARS) 
#LOCAL_MODULE := doubleIt_prebuilt 
#LOCAL_SRC_FILES := $(LOCAL_PATH)/libDoubler.a 
#LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) 
##LOCAL_SRC_FILES := libDoubler.a 
#include $(PREBUILT_STATIC_LIBRARY) 

###################### test app ################## 
include $(CLEAR_VARS) 

# binary name 
LOCAL_MODULE:= testApp 

# c++ file extension 
LOCAL_CPP_EXTENSION := .cpp 

# src files 
LOCAL_SRC_FILES := main.cpp 

# include dir 
LOCAL_C_INCLUDES := $(LOCAL_PATH) 

### this works in Android src, but not in NDK 
LOCAL_LDLIBS := -L$(LOCAL_PATH) -lDoubler 

### prebuilt lib works in NDK but not Android src 
#LOCAL_STATIC_LIBRARIES := doubleIt_prebuilt 

#what to build 
include $(BUILD_EXECUTABLE) 

В конце концов, что такое правильный способ связать статическую LIB в дереве Src?

ответ

3

Почему это?

ndk-build и система сборки AOSP - это две совершенно разные системы сборки, которые, к сожалению, очень похожи.

В конечном счете, что является правильным способом связывания статической библиотеки lib в дереве src?

В дереве AOSP? Предварительно установленные модули определяются по-разному. Вот несколько примеров:

https://android.googlesource.com/platform/prebuilts/sdk/+/9c011b3a7784803b96dc0f0a840aa9033a0cd62a/tools/Android.mk#291

include $(CLEAR_VARS) 
LOCAL_MODULE := libbcc 
LOCAL_SRC_FILES := $(HOST_OS)/lib64/$(LOCAL_MODULE)$(HOST_SHLIB_SUFFIX) 
LOCAL_MODULE_CLASS := SHARED_LIBRARIES 
LOCAL_MODULE_TAGS := optional 
LOCAL_MODULE_SUFFIX := $(HOST_SHLIB_SUFFIX) 
LOCAL_IS_HOST_MODULE := true 
LOCAL_MULTILIB := 64 
include $(BUILD_PREBUILT) 

https://android.googlesource.com/platform/development/+/518e6c3a28cc63fd094c8b255e268650b03fdab5/host/windows/prebuilt/usb/Android.mk

include $(CLEAR_VARS) 
LOCAL_IS_HOST_MODULE := true 
LOCAL_MODULE := AdbWinApi 
LOCAL_MODULE_CLASS := STATIC_LIBRARIES 
LOCAL_SRC_FILES_x86 := AdbWinApi.a 
LOCAL_MODULE_SUFFIX := .a 
LOCAL_MULTILIB := 32 
LOCAL_MODULE_HOST_OS := windows 
include $(BUILD_PREBUILT) 

Вы затем использовать их так же, как и любой другой библиотеки: LOCAL_STATIC_LIBRARIES := libmyprebuilt. Оба приведенных выше примера предназначены для хост-модулей. Для целевого модуля просто удалите эту строку.

Обратите внимание, что новая система сборки AOSP (все еще выполняется), Soong, еще не имеет поддержки для предварительно построенных модулей. Они могут быть определены только в файлах Android.mk прямо сейчас.

+0

Это работает. Благодаря! Стоит отметить, что LOCAL_IS_HOST_MODULE, похоже, скажет системе сборки, что этот модуль является частью хоста/дерева? Поэтому, если вы предоставите свою собственную старую библиотеку, оставьте эту строку – DMacAttack