3

スタック オーバーフローに関するこれと同様の他の質問を読みましたが、シナリオのようなものはありません。

Android用の静的ライブラリをプリコンパイルするFreeImage.a(23 MBファイル)ファイルがあります。ヘッダー ファイルを含む FreeImage Project のソース コードもあります。

私の JNI コード (FreeImageCompilation.cpp) で持っている(.a) ファイルから .SO ファイルをビルドしたいです。

*.a ファイルを使用するための以下のコードが正しいかどうかを誰かが確認できますか?

My Android.mk には、次のコードがあります。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := FreeImage
LOCAL_SRC_FILES := libFreeImage.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/FreeImage/Source/
include $(PREBUILT_STATIC_LIBRARY)

#My Own SO file

LOCAL_STATIC_LIBRARIES := FreeImage
include $(CLEAR_VARS)
LOCAL_MODULE    := FreeImageSo
LOCAL_SRC_FILES := FreeImageCompilation.cpp
LOCAL_STATIC_LIBRARIES := FreeImage
include $(BUILD_SHARED_LIBRARY)
4

2 に答える 2

3

タイトルからの質問に答えるために、静的ライブラリから共有ライブラリを作成する方法は次のとおりです。

# static library 1
include $(CLEAR_VARS)
LOCAL_MODULE := lib1
LOCAL_SRC_FILES := lib1.cpp
include $(BUILD_STATIC_LIBRARY)

# static library 2
include $(CLEAR_VARS)
LOCAL_MODULE := lib2
LOCAL_SRC_FILES := lib2.cpp
include $(BUILD_STATIC_LIBRARY)

# this shared library will have all symbols from two above libraries
include $(CLEAR_VARS)
LOCAL_MODULE := lib_shared
LOCAL_SRC_FILES := empty.cpp
LOCAL_WHOLE_STATIC_LIBRARIES := lib1 lib2
include $(BUILD_SHARED_LIBRARY)

注意すべき重要なオプションはLOCAL_WHOLE_STATIC_LIBRARIES. regular を使用すると、lib_shared のシンボルもlib_sharedLOCAL_STATIC_LIBRARIESのシンボルも使用しないため、リンク時にそれらが取り除かれます。これを防ぐには、次のオプションをリンク行に追加して、シンボルが削除されないようにします。lib1lib2LOCAL_WHOLE_STATIC_LIBRARIES

-Wl,--whole-archive -llib1 -llib2 -Wl,--no-whole-archive

詳細については、こちらのブログ投稿をご覧ください: http://gosuwachu.io/

于 2016-04-13T19:03:40.957 に答える
0

それは完全に正しいですが、概念について混乱しているようです。予想どおり、静的ライブラリは共有ライブラリに含まれていません。静的ライブラリは共有ライブラリにリンクされているだけです。最後に、プログラムが適切に機能するには、すべてを保持する 1 つの大きな .so ファイルではなく、.so ファイルと .a が必要です。

于 2013-09-19T09:25:06.337 に答える