3

問題: Android アプリケーションで使用している共有ライブラリ (ライブラリ A など) で使用するために、gnutls を Android に移植する必要があります。

私が試したこと: openconnect のmake ファイルを変更して、gnutls とその依存関係 (libgmp、libnettle、libhogweed) の .a 静的ライブラリ ファイルを生成し、それらを使用して Android プロジェクトで静的ライブラリを構築し、それらを参照しました。共有ライブラリ A. コードは正常にビルドおよびインストールされますが、M+ デバイスでは実行時に次のエラーが発生します。

java.lang.UnsatisfiedLinkError: dlopen failed: libA.so: has text relocations

スタティック ライブラリ (.a ファイル) をビルドするときにフラグを渡そうとしましたが-fPIC、libA.so ファイルをビルドするときに、libA.so ファイルに常に TEXTREL エントリが表示されます。以前はlibAを問題なく使用していたので、これらの新しい静的ライブラリが原因であると確信しています。私が試した他のこと: gnutls を共有ライブラリとしてビルドしようとしましたが、生成された libA.so にはテキストの再配置がありませんでしたが、gnutls so ファイルにはバージョン (例: libgnutls.so.3.0) があり、Android にはバージョンがあるため、実行時にまだロードに失敗します。バージョン管理されたライブラリをサポートしていません。

具体的な質問: 1. gnutls をテキストの再配置なしで静的ライブラリとしてビルドするか、または 2. soname のない共有ライブラリとしてビルドしますか?

編集: openconnect メーリング リストで同じ質問が寄せられていますが、「最初にネイティブ コードの TEXTREL を修正する」方法について明確な方法はありません。

この質問この質問のようなテキストの再配置に関する問題に対する他の回答を見てきましたが、最新の NDK ビルドを使用して PIC フラグを既に渡しているため、それは役に立ちませんでした

4

2 に答える 2

0

私はついにそれを理解しました。gnutls は nettle と gmp に依存し、nettle も gmp に依存しているため、gmp を共有ライブラリとして構築し、残りを静的ライブラリとして構築する必要がありました。sonames のないビルドは libgmp だけだったので、この方法でビルドしても問題はありませんでした。これが私の最終的な Android.mk です。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libgmp
LOCAL_SRC_FILES := lib/$(TARGET_ARCH_ABI)/libgmp.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := libhogweed
LOCAL_SRC_FILES := lib/$(TARGET_ARCH_ABI)/libhogweed.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := libnettle
LOCAL_SRC_FILES := lib/$(TARGET_ARCH_ABI)/libnettle.a
LOCAL_SHARED_LIBRARIES := libgmp
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := libgnutls
LOCAL_SRC_FILES := lib/$(TARGET_ARCH_ABI)/libgnutls.a
LOCAL_SHARED_LIBRARIES := libgmp
LOCAL_STATIC_LIBRARIES := libhogweed libnettle
include $(PREBUILT_STATIC_LIBRARY)
于 2016-09-14T22:24:10.970 に答える