2016-09-20 5 views
0

私はAndroid NDKでテストアプリを持っています。以前は、提供された静的ライブラリを使ってこのアプリケーションをコンパイルして実行することができました。提供された静的なlibは "libfulllib.a"でした。今、私はラッパー関数を書いており、ラッパー関数のlibを作っています。つまり、 "libwrapper.a"です。私の作業android.mkファイルには、次のようになります。2つのライブラリのマージはアンドロイドでは機能しません。ndk

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := rip_test 
LOCAL_SRC_FILES := src/rip_test.cpp 

LOCAL_CFLAGS := -DCLR_INTERAPTIV_I7 -DCLR_INTERAPTIV -v 
LOCAL_C_INCLUDES := \ 
    $(LOCAL_PATH)/../../RIP/include/ \ 
    $(LOCAL_PATH)/../../../hardware/libhardware/include/hardware \ 
    $(LOCAL_PATH)/../../../hardware/libhardware/include \ 
    $(LOCAL_PATH)/src \ 
    $(LOCAL_PATH)/../../RIP/inc \ 

LOCAL_SHARED_LIBRARIES = libsmem.sastra 

LOCAL_LDFLAGS := \ 
    -v \ 
    -L$(ANDROID_PRODUCT_OUT)/system/lib \ 
    -lsmem.$(TARGET_BOARD_PLATFORM) \ 
    -L$(LOCAL_PATH)/../../RIP/library \ 
    -lwrapper \ 
    -lfulllib \ 
    -llog \ 
    -lcutils \ 
    -lipc.$(TARGET_BOARD_PLATFORM) \ 

# this option will build executables instead of building library for 
# android application. 
include $(BUILD_EXECUTABLE) 

ここでラッパーが私と機能の本当の定義を含むフルによって行われたライブラリです。 私は誰にもfulllibを公開したくないので、すべての ".o"をラッパーと "fulllib"から取り出しました。 「すべて」の図書館を作った。今、私のandroid.mkは次のようになります:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := rip_test 
LOCAL_SRC_FILES := src/rip_test.cpp 

LOCAL_CFLAGS := -DCLR_INTERAPTIV_I7 -DCLR_INTERAPTIV -v 
LOCAL_C_INCLUDES := \ 
    $(LOCAL_PATH)/../../RIP/include/ \ 
    $(LOCAL_PATH)/../../../hardware/libhardware/include/hardware \ 
    $(LOCAL_PATH)/../../../hardware/libhardware/include \ 
    $(LOCAL_PATH)/src \ 
    $(LOCAL_PATH)/../../RIP/inc \ 

LOCAL_SHARED_LIBRARIES = libsmem.sastra 

LOCAL_LDFLAGS := \ 
    -v \ 
    -L$(ANDROID_PRODUCT_OUT)/system/lib \ 
    -lsmem.$(TARGET_BOARD_PLATFORM) \ 
    -L$(LOCAL_PATH)/../../RIP/library \ 
    -lall \ 
    -llog \ 
    -lcutils \ 
    -lipc.$(TARGET_BOARD_PLATFORM) \ 

# this option will build executables instead of building library for 
# android application. 
include $(BUILD_EXECUTABLE) 

私はコンパイルできますが、テストアプリケーションは同じように動作しません。私は尋ねたい: これはやっても安全ですか?

2つの違いは何ですか? 2つの静的ライブラリをマージ時に問題が発生する可能性があります

答えて

0

いくつかの点:どちらかのライブラリで

  1. 重複シンボル。

    両方のモジュールで関数fooが定義されている場合、どちらが使用されるかは未定義です。これはライブラリをマージしなくても当てはまりますが、見つかった最初のシンボルが使用されることが多く、fulllibのシンボルがwrapperの前になるようにライブラリを再パックすると、別の定義を使用している可能性があります。

  2. 同じ名前の複数の.oファイル。

    これを安全に行う方法はありますが、liball.aを作成した方法によっては、libfulllib.aのfoo.oがlibwrapper.a(またはその逆)のものを上書きしている可能性があります。

これはおそらく網羅的なリストではありませんが、これは私が過去に遭遇したいくつかの問題です。

関連する問題