2016-09-28 14 views
3

最近、ndk-buildからビルドされたスタティックライブラリをリンクすることは、アンドロイドソースツリー(mm)とは基本的に異なることがわかりました。どうしてこれなの?あらかじめビルドされたスタティックライブラリのリンクndkと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; 
    } 

アンドロイドMK:

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) 

最終的には、SRCツリーに静的libがリンクする正しい方法は何ですか?

答えて

3

なぜですか?

ndk-buildとAOSPビルドシステムは、残念ながら非常に似ている2つの全く異なるビルドシステムです。

最終的に、srcツリーに静的なlibをリンクする正しい方法は何ですか?

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

関連する問題