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ファイルにあります.
     
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は本当にすごいですね.これで何のメリットがありますか.
 
事前に実装を見つけなければならないので、実行時に安全になりますか?これでは面倒ではないか.