28

Android用のOpenSSL1.0.1cの(.so)ファイルの共有ライブラリを生成しようとしています。androidスクリプトでAndroid用にコンパイルするための3つのオプションが追加されていることがわかりました。

./Configure android-armv7  (or)
./Configure android-x86    (or)
./Configure android

OS用に構成してからコンパイルしようとすると、エラーがスローされます。現在、x86 windows7を使用しており、Cygwin、Android sdk R20、AndroidNDKr8をインストールしています。

sh-4.1$ make
making all in crypto...
make[1]: Entering directory `/cygdrive/d/SourceCodes/OpenSSL/openssl-1.0.1c/crypto'
gcc -I. -I.. -I../include  -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -march=armv7-a -mandroid -I/include -B/lib -O3 -fomit-frame-pointer -Wall -DOPENSSL_BN_ASM_MONT -DOP
ENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DAES_ASM -DGHASH_ASM   -c -o cryptlib.o cryptlib.c
cc1: error: unrecognized command line option "-mandroid"
cryptlib.c:1:0: error: bad value (armv7-a) for -march= switch
<builtin>: recipe for target `cryptlib.o' failed
make[1]: *** [cryptlib.o] Error 1
make[1]: Leaving directory `/cygdrive/d/SourceCodes/OpenSSL/openssl-1.0.1c/crypto'
Makefile:278: recipe for target `build_crypto' failed
make: *** [build_crypto] Error 1
sh-4.1$

誰かが同様の問題に直面し、同じ問題を解決するための解決策を得た場合は、私に知らせてください。

4

13 に答える 13

15

OpenSSL 1.0.1e で行う必要があるのは、次のことだけです。

CC=~/android-ndk-r9/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc ./Configure android-armv7
ANDROID_DEV=~/android-ndk-r9//platforms/android-8/arch-arm/usr make build_libs
于 2013-09-12T19:26:22.727 に答える
3

ここでは、私にとって役立つ Android 用 OpenSSL のビルド環境について、いくつかの役立つアドバイスをまとめました。

  • 複数のアーキテクチャのビルドをサポート - ARM、ARMv7、X86
  • OpenSSL ソースコードを使用
  • Android.mk ビルドと統合
  • コンパイル済みの OpenSSL 1.0.2h が含まれています (必要に応じて使用するか、独自にコンパイルしてください)

https://github.com/ph4r05/android-openssl

于 2016-09-18T15:46:51.127 に答える
0

この問題とそれに似た他の多くの問題により、1週間ほどいじくり回しましたが、最終的に解決できたので、解決策を共有したいと思いました. OpenSSL は 21 以降用にコンパイルでき、コードをハッキングする意思がある場合は Android 4.03 デバイスで動作します。libcurl を使用しているため、最新の状態にしたいと考えていました。手順は少し複雑です。

まず、ビルド可能なバージョンの libcurl があることを確認します。良い出発点としてお勧めします https://github.com/cocos2d/cocos2d-x-3rd-party-libs-src

彼らは最新のビルド スクリプトを維持します。

まず、「ビルド」で android.ini をバージョン 21 にハックします。

次に、次のスタブ関数を jni プロジェクトのどこかに追加する必要がありました。

// SPECIAL API 21+ functions required for android to build on newer platform targets.

float strtof (const char* str, char** endptr)
{
    return (float)strtod(str, endptr);
}

int __isnanf(float x)
{
    return (x != x);
}

double atof (const char* s)
{
    double rez = 0, fact = 1;
    if (*s == '-'){
        s++;
        fact = -1;
    };
    for (int point_seen = 0; *s; s++){
        if (*s == '.'){
            point_seen = 1;
            continue;
        };
        int d = *s - '0';
        if (d >= 0 && d <= 9){
            if (point_seen) fact /= 10.0f;
            rez = rez * 10.0f + (float)d;
        };
    };
    return rez * fact;
}

void srandom(unsigned int seed)
{
    std::srand(seed);
}

static unsigned long _next = 1;

void srand(unsigned int seed)
{
    _next = seed;
}

long random()
{
    return rand();
}

int rand()
{
    _next = _next * 1103515245 + 12345;
    return (unsigned int)(_next/65536) % 32768;
}

/* the default is bsd */
__sighandler_t signal(int s, __sighandler_t f)
{
    return 0;
}

シグナル関数の方が優れている可能性がありますが、私たちにとっては重要ではないことに注意してください。これにより、4.03 デバイスで 5 以降のヘッダーの変更によって発生する「シンボルが見つかりません」という恐ろしいエラーが発生しなくなります ( https://groups.google.com/forum/#!topic/android-ndk/RjO9WmG9pfE )。

次に、ビルドしたいバージョンの openssl の tar.gz をダウンロードし、どこかに解凍します。crypto/ui/ui_openssl.c および crypto/des/read_pwd.c を編集し、tcsetattr の #defines が使用されていないことを確認します。私はブルート フォース #if 0 と #if 1 を使用しました。これは、プリプロセッサをいじることで可能になるはずですが、この時点であきらめました。誰かが正しい魔法を分かち合いたいと感じたら、してください!

ここで、ファイルを tarballs ファイルに再 tar する必要があります (そこにルート フォルダーがあることを確認してください:

そして実行します(私の場合)

shasum -a 512 curl-7.50.0.tar.gz > ../src/curl/SHA512SUMS

これにより、cocos2d ./build.sh を実行できるようになります。何かのようなもの:

./build.sh -p=android --libs=openssl,curl --arch=armv7 --mode=release

最後に、これはユニバーサル .a ファイルを作成するという点で私を捕まえましたが、問題の直接の一部ではありません。NEON 命令を使用しないバージョンを使用してください。Tegra 2 デバイスには明らかに FPU がありますが、NEON はありません。これはコンパイラ フラグとして -mfpu=vfp を使用して実行できると思いますが、この分野ではパフォーマンスはあまり重要ではないため、代わりに armv5 ビルドを使用することにしました (そして、このことから現実世界での厄介な驚きが十分にありました)。すでに)。

最終的には、どこでも機能し、最新かつ最高の Android をターゲットとするプロジェクトで使用できる素敵な .a を取得する必要があります。OpenSSL プロジェクトの誰かだけがこれを読んでプロジェクトを修正し、2 年前にリリースされた Android のものを理解できるようになれば!

幸運を!

于 2016-07-30T20:15:25.490 に答える
0

これで問題が解決するわけではありませんが、おそらく役立つでしょう。Android 用の OpenSSL 1.0.1 beta2 のコンパイルに成功した Google グループの投稿。

https://groups.google.com/forum/?fromgroups#!topic/android-security-discuss/5-_gCAmEo-M

Android 用に 1.0.0a をビルドするオープン ソース プロジェクトも役立つかもしれません。

https://github.com/eighthave/openssl-android

于 2012-08-15T01:28:25.787 に答える
0

これは私がopenssl-1.0.2gで行った方法です:

$ rm -rf openssl-1.0.2g/
$ tar xzf openssl-1.0.2g.tar.gz
$ chmod a+x setenv-android.sh
$ . ./setenv-android.sh ---> Note: make sure in the same folder of your openssl-1.0.2g
$ cd openssl-1.0.2g/

$ perl -pi -e 's/install: all install_docs install_sw/install: install_docs install_sw/g' Makefile.org

$ ./config shared no-ssl2 no-ssl3 no-comp no-hw no-engine --openssldir=<Path of your OpenSSL> 

$ make depend
$ make clean
$ make all
before make install, ---Delete the "include" folder (path/of/your/openssl-1.0.2g/include)  or you may move it to another directory for safe keeping. 
$ make install 

setenv-android.sh に正しい NDK パスを入力していることを確認してください。そうしないと、エラーが発生します。

このビルドの例では、Android NDK vr10b ( http://dl.google.com/android/ndk/android-ndk32-r10b-darwin-x86.tar.bz2 ) を使用し、setenv-android 内で ff パス値を使用しました。 sh ファイル:

_ANDROID_NDK="android-ndk-r10b" (Line 12)
_ANDROID_EABI="arm-linux-androideabi-4.8"(Line 16)
_ANDROID_API="android-19"(Line 24)

参考: https ://wiki.openssl.org/index.php/Android

注 --->この質問に答えるために github コミットを作成しました。https ://github.com/rjmangubat23/OpenSSL を参照してください。

setenv-android.sh のさまざまなスクリプトを github にアップロードしました。これは、アーキテクチャごとに異なる種類のスクリプトが必要になるためです。

x86 の場合: https://github.com/rjmangubat23/OpenSSL/tree/master/x86

ArmV7 の場合: https://github.com/rjmangubat23/OpenSSL/tree/master/ArmV7

ここから Openssl をダウンロードしてください: ftp://ftp.openssl.org/source

ここから Android NDK ファイルの完全なリストをダウンロードします: https://github.com/taka-no-me/android-cmake/blob/master/ndk_links.md

于 2016-05-05T06:17:16.083 に答える
-1

最新の Openssl for Android のコンパイルについては、 PJSIP Build For Android with Integration of G729 Codecを参照してください。それはかなりよく説明されています。

于 2020-07-02T12:51:39.367 に答える