3

次のような状況があります。AES 暗号化に OpenSSL を使用してアプリの一部を移植しています。すべてをコンパイルしましたが、リンカーが失敗します。状況は次のとおりです。 1.単純に次のことを行う JNI ラッパーを作成しました。

private native String cipherString(String plainData, int datasize, String password, int passSize);
private native String decipherString(String cipheredData, int datasize, String password, int passSize);

次に、jstring を char * に変換し、その他すべての必要な変換を行う適切な JNI シンタックスを持つ c++ ファイルを呼び出し、実際に openssl ヘッダー (存在し、説明されている) をインポートし、openssl メソッドを呼び出す別の cpp ファイルを呼び出します。暗号化と解読用。

したがって、ndk-build を呼び出すと、すべてのサムがビルドされるため、コンパイラはそれらを正しくコンパイルします。次に、Android用にopensslを移植する必要があり、このOpenSSL for Android を使用しました。これは、単純なndk-build(もちろんプロジェクトのルートにあります)でcharのように機能し、libssl.soとlibcrypto.soをビルドします

だから私は2つを接続する必要があります..ビルドスクリプトを接続するのは難しいと思います.1つのndk-buildがすべてをコンパイルしてリンクします(時間があれば簡単なサンプルプロジェクトをいただければ幸いです)

そのため、コンパイル済みの libssl および libcrypto .so ファイルを jni/includes/prebuilt にコピーし、それらをプロジェクトに含めて、リンカーが最後に使用する lib を最終的に作成できるようにします。

次の Android.mk ファイルがあります

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/includes/build/common.mk
include $(LOCAL_PATH)/includes/build/common_includes.mk
APP_STL := gnustl_static

LOCAL_MODULE    := packer
LOCAL_SRC_FILES := modules/cipher/wrapper.cpp \
                    ... #rest of the cpp code

LOCAL_C_INCLUDES += $(LOCAL_PATH)/includes/openssl 
LOCAL_SHARED_LIBRARIES := $(LOCAL_PATH)/includes/precompiled/libssl.so \
            $(LOCAL_PATH)/includes/precompiled/libcrypto.so 
LOCAL_SHARED_MODULES := sslx cryptox
include $(BUILD_SHARED_LIBRARY)

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := sslx
LOCAL_SRC_FILES := $(LOCAL_PATH)/includes/precompiled/libssh.so
include $(PREBUILT_SHARED_LIBRARY)

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := cryptox
LOCAL_SRC_FILES := $(LOCAL_PATH)/includes/precompiled/libssh.so
include $(PREBUILT_SHARED_LIBRARY)

そして ndk-build を呼び出すと、がっかりします

sslx: LOCAL_SRC_FILES points to a missing file. Check that /home/user/Development/Tools/sdk/android/ndk/build/core//home/user/Development/Tools/sdk/android/ndk/build/core/includes/precompiled/libssh.so exists  or that its path is correct. Aborting    .  Stop.

パスが完全に間違っているとすでに推測できるので、混乱しているのは、 ${LOCAL_PATH} がインクルードの最初のバッチに対して正しいパスを返し、.so ファイルに対して完全に間違ったパスを返すことです...どんな助けも本当に感謝しています!

4

2 に答える 2

8

これがNDK8cに更新されたソリューションです

ステップ ゼロ: Android NDK をダウンロードして修正する方法はわかりませんが、ndk には非常に興味深い欠陥があり、(私の意見では) 多くのものをコンパイルすることはできません。そのため、OpenSSL をコンパイルできるようにするには、小さな修正、ツールを保持している場所に ndk8c を抽出し、ファイルを編集します: android-ndk-r8c/build/gmsl/__gmsl 行 512: 行を変更

int_encode = $(__gmsl_tr1)$(wordlist 1,$1,$(__gmsl_input_int))

ライン付き

int_encode = $(__gmsl_tr1)$(wordlist 1,$(words $1),$(__gmsl_input_int))

そして、あなたは行ってもいいです!

ステップ 1 : OpenSSL をダウンロードして Android 用にコンパイルします。ここにある移植バージョンをコンパイルするか 、OpenSSL の公式 1.0.0c バージョンをダウンロードしてから、Android 互換バージョン用にリンクした github で提供されているマニュアルを使用して Android 用にコンパイルします。

次のステップは、libssl.solibcrypto.soを取得 し、簡単にアクセスできるように NDK フォルダーに配置することです。

openssl-folder/libs/armeabi/

android-ndk-r8c/platforms/android-8/arch-arm/usr/lib

このようにコンパイルすると、単純なリンカー スイッチを使用してライブラリを含めることができます。-lssl -lcrypto

ステップ 2 :ここでCurl の最新ソースを取得します。

Docs/INSTALL でファイルを開き、スタンドアロン ツールチェーンを作成して目的のフォルダーに配置するために必要な手順に従います。その後、トリッキーな部分として、スタンドアロンをコンパイルしたにもかかわらず、構成を続行するために Android のソース コードが必要でした。 openssl そこからヘッダー ファイルを含めることもできます。いずれにせよ、これはより複雑なバージョンなので、何をするかを選択します。私はそれらを回避することを選択しなかったので、Google AOSP サイトにアクセスして、ビルドと初期化の手順を実行できます。環境。

したがって、次のようになります。

1.ダウンロード、

  1. ソースコードのルートに移動して実行します:

    ~: ビルド/envsetup.sh; 昼食 1; 作る;

最後に、SSL をサポートするように curl をコンパイルする必要があります。

ステップ 3

curl を目的のフォルダーに抽出します (http/s 以外のすべてを無効にして、ライブラリをできるだけ小さくし、約 300k を意味するようにしたいという具体的な欲求があります。lib でより多くのプロトコルが必要な場合は、 --disable-protocol を削除します必要なプロトコル) 以下を実行します。

make clean

export PATH=/opt/arm-linux-androideabi-4.4.3/bin:$PATH

export LDFLAGS="\
-lssl \
-lcrypto \
-L/home/user/Development/Tools/sdk/android/ndk/platforms/android-8/arch-arm/usr/lib"

export CFLAGS="\
-I/home/user/Development/AOSP/2.3.7/system/core/include \
-I/home/user/Development/Tools/sdk/android/ndk/platforms/android-8/arch-arm/usr/include"

./configure --host=arm-linux-androideabi \
--with-ssl=/home/user/Development/Projects/portingLibs/openssl-android-master \
--disable-ftp \
--disable-gopher \
--disable-file \
--disable-imap \
--disable-ldap \
--disable-ldaps \
--disable-pop3 \
--disable-proxy \
--disable-rtsp \
--disable-smtp \
--disable-telnet \
--disable-tftp \
--without-gnutls \
--without-libidn \
--without-librtmp \
--disable-dict


make



Note that in the block above, if you don't want to use the AOSP source, you could switch 

-I/home/user/Development/AOSP/2.3.7/system/core/include \

with the include folder for your ssl distribution.

最後に : static :

curl-7.28.1/lib/.libs/libcurl.a

と共有:

curl-7.28.1/lib/.libs/libcurl.so.5.3

それだけです..ファイルを取得して、コンパイルしてください:)

于 2012-04-24T09:58:10.523 に答える
0

@たんちょう

あなたが言及した __gmsl:512 行に変更を加えました。OpenSSL のコンパイルを許可する一方で、$(BUILD_EXECUTABLE) によって実行可能ファイルのビルドも中断します。変更前は単純な hello world アプリケーションがコンパイルされて実行されましたが、変更後はコンパイルされましたが、Nexus で実行するとセグ フォールトが発生しました。

変更を元に戻すと、すべてが正常に戻ります。これを修正する方法がわかりません。その行が何をするかはよくわかりませんが、これは、その変更を行っている人へのちょっとした警告です。

于 2013-01-16T22:27:41.180 に答える