Andoridコンパイルsoはなぜインタフェースを探して実装しなければならないのですか?
2062 ワード
Andoridコンパイルsoはなぜインタフェースを探して実装しなければならないのですか?
ndkでもソース環境でもコンパイルでも、ヘッダファイルだけを提供すればいいわけではありません.コンパイラが具体的な実装のsoを見つける必要があります.soには実装されていないインタフェースが間違っています.例えば、error:undefined reference to'SSL_library_init'
Opensslを例にとると,ndkでのコンパイルとソース環境でのコンパイルの違いを2つのプロジェクトでそれぞれテストし,いずれも同じであることが分かった.それはlibcryptを見つけなければならないということです.soとlibssl.soこそできる.これはsoダイナミックライブラリに対する認識に反するでしょう.有識者に教えてもらいましょう.
試験手順:
eclipseのプロジェクトは、ndkでsoをコンパイルし、mkファイルにあります.
対応するエラーメッセージはtest_JniTest.c:14: undefined reference to `SSL_library_init'
プロジェクトをソース環境でコンパイルする場合は、mkファイルを次のように変更する必要があります.
引用したから
だから正常にコンパイルすることができて、この2つのsoはすべてout/下のsystem/libの下にあります.androidに伴うexternal/openssl/コンパイルが存在するので、直接使えます.この2つのライブラリをキャンセルすると、結果はndkと同じです.
error: undefined reference to 'SSL_library_init'
ndkでopensslをどのようにコンパイルするかについては、次回Demoを作って置いておきましょう.原理はプリコンパイルです.どうせインタフェースの実現から離れられないんだから、ああ、androidは本当にすごいですね.これで何のメリットがありますか.
事前に実装を見つけなければならないので、実行時に安全になりますか?これでは面倒ではないか.
ndkでもソース環境でもコンパイルでも、ヘッダファイルだけを提供すればいいわけではありません.コンパイラが具体的な実装のsoを見つける必要があります.soには実装されていないインタフェースが間違っています.例えば、error:undefined reference to'SSL_library_init'
Opensslを例にとると,ndkでのコンパイルとソース環境でのコンパイルの違いを2つのプロジェクトでそれぞれテストし,いずれも同じであることが分かった.それはlibcryptを見つけなければならないということです.soとlibssl.soこそできる.これはsoダイナミックライブラリに対する認識に反するでしょう.有識者に教えてもらいましょう.
試験手順:
eclipseのプロジェクトは、ndkでsoをコンパイルし、mkファイルにあります.
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= dingran_sotest_test_JniTest.c
LOCAL_MODULE := soTest
include $(BUILD_SHARED_LIBRARY)
対応するエラーメッセージはtest_JniTest.c:14: undefined reference to `SSL_library_init'
プロジェクトをソース環境でコンパイルする場合は、mkファイルを次のように変更する必要があります.
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= dingran_sotest_test_JniTest.c
LOCAL_MODULE := soTest
LOCAL_SHARED_LIBRARIES := \
libutils \
libstlport \
libcrypto \
libssl \
base := $(LOCAL_PATH)
LOCAL_C_INCLUDES := \
$(base)/../include \
$(base)/../stbruntime \
include $(base)/../../stlport/libstlport.mk
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)
引用したから
libcrypto \
libssl \
だから正常にコンパイルすることができて、この2つのsoはすべてout/下のsystem/libの下にあります.androidに伴うexternal/openssl/コンパイルが存在するので、直接使えます.この2つのライブラリをキャンセルすると、結果はndkと同じです.
error: undefined reference to 'SSL_library_init'
ndkでopensslをどのようにコンパイルするかについては、次回Demoを作って置いておきましょう.原理はプリコンパイルです.どうせインタフェースの実現から離れられないんだから、ああ、androidは本当にすごいですね.これで何のメリットがありますか.
事前に実装を見つけなければならないので、実行時に安全になりますか?これでは面倒ではないか.