簡體   English   中英

通過NDK在Android上加載其他版本的系統共享庫?

[英]Load a different version of system shared library on Android by NDK?

我正在嘗試通過使用一些本機庫來開發android應用程序,但是android 4.0android 4.1.2上的系統共享庫是不同的。 為了確保兼容性,我從平台4.0獲取libskia.so文件,並將其導入到我的項目中。 我希望像使用第三方共享庫一樣加載此共享庫。 不幸的是,在android 4.1.2上運行時,我的應用程序似乎仍稱為system skia庫。 我對此一無所知,以下是我的Android.mk文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := sample
LOCAL_SRC_FILES := sample-jni.cpp

LOCAL_CFLAGS    := -I /home/WORKING_DIRECTORY/external/skia/include \
-I /home/WORKING_DIRECTORY/external/skia/include/core \
-I /home/WORKING_DIRECTORY/frameworks/base/core/jni/android/graphics  \
-I /home/WORKING_DIRECTORY/frameworks/base/include \
-I /home/WORKING_DIRECTORY/frameworks/base/native/include/android \
-I /home/WORKING_DIRECTORY/system/core/include \
-I /home/WORKING_DIRECTORY/external/skia/include/xml \
-I /home/WORKING_DIRECTORY/external/skia/include/images \
-I /home/WORKING_DIRECTORY/external/skia/include/views \

 LOCAL_SHARED_LIBRARIES :=skia jnigraphics
 include $(BUILD_SHARED_LIBRARY)
 include $(LOCAL_PATH)/prebuilt/Android.mk

和預構建的makefile

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := skia
LOCAL_SRC_FILES := libskia.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := jnigraphics
LOCAL_SRC_FILES := libjnigraphics.so
include $(PREBUILT_SHARED_LIBRARY)

有任何想法嗎? 或者,還有其他方法可以確保兼容性嗎?

希望您了解,不建議對系統庫除穩定API以外的任何依賴項。 但是Android的開放性(在技術上和許可方面)都允許引入這種依賴關系。 從本質上講,這意味着要在未包租的水域中航行,並且不僅要在平台的下一版本中,而且要在同一平台級別的供應商提供的(即非AOSP)設置中進行API更改的准備。

從理論上講,您可以將系統庫的變體的副本放入應用程序的libs / armeabi-v7a文件夾中,並使用System.load(fullPath)而不是loadLibrary()進行加載。

但是實際上,我相信在有機會執行代碼之前,將在您的進程中加載system / lib / libskia.so ,並且您不能在同一進程中加載​​同一庫的兩個版本。 同樣,較舊版本的libskia很可能無法在系統上加載,因為它依賴於其他系統庫。

確保向前(和供應商)兼容性的最安全方法是對未記錄的系統功能使用動態鏈接 ,並在此過程中執行仔細的錯誤檢查。

但是在許多情況下,系統未記錄的API實際上非常穩定,並且Google Android團隊中的好人並不經常進行重大更改。 因此,如果您鏈​​接到Skia的4.0版本,則您的代碼很可能僅適用於4.1.2和...

更新:在您的特殊情況下,當在舊類中添加了額外的字段fTextLocale時,您應該首先祝福那些沒有在類聲明的中間插入該字段的開發人員。 因為現在您有了一個合理的策略:使用4.1.2標頭(帶有多余的字段),鏈接到4.0庫(該庫不會將訪問方法引入新字段),您的代碼有望正常工作。

通過在本機代碼中使用參數RTLD_DEEPBIND使用dlopen,可以使用其他版本的libskia。 這將覆蓋全局符號表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM