この問題とそれに似た他の多くの問題により、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 のものを理解できるようになれば!
幸運を!