1

コンパイル/リンク段階で Android-NDK を使用してバイナリを (クロス) コンパイルしましたが、エラーは発生しませんでした。アプリケーションは静的にリンクされています。

Nesux7 エミュレーターを使用して実行します。

 $ adb shell mount -o remount,rw /system
 $ adb push myApp /system/bin
 $ adb shell /system/bin/myApp

「OK」で動作し、正しい出力を出力します。

次に、最終的な apk を作成し、実際の電話にインストールします。実行に失敗します。アプリのデバッグ:

 $ adb shell
 $ run-as com.blablabla.myapp
 $ cd /data/data/com.blablabla.myapp/files/bin
 $ ./myApp

次のエラーが発生します:

reloc_library[1306]: 21538 cannot locate 'log2'...
CANNOT LINK EXECUTABLE

別の投稿 ( NDK: libm static linking ) で、誰かが libm.a と libm.so の違いについて不平を言っていますが、とにかく、私のエミュレーターで動作するので、コンパイルは「まあまあ」だと思います。

私はこの時点で完全に立ち往生しています。何か案が?

4

1 に答える 1

4

最後に、問題の原因を見つけました。

/opt/android-ndk-r9d/platforms/android- 19を NDK として使用していました。このバージョンには、標準の libm プラットフォームに log2 およびその他の数学関数が既に含まれているため、このバージョンの Android を使用するデバイス/エミュレーターでのコンパイルまたは実行中に問題は発生しませんでした。

古いバージョンにはそのような関数が含まれていないため、コンパイルが「OK」であっても実行時にエラーが発生します。古いプラットフォーム /opt/android-ndk-r9d/platforms/android- 3を使用すると、ソース コード (avconv/ffmpeg) がそれを検出し、libavutil/libm.h のカスタム マクロに置き換えました。これにより、コンパイル/実行の問題が修正され、どの Android バージョンでも動作することが保証されます。

各プラットフォーム/Android-N に何が含まれているかについてのドキュメントはあまりありません。さまざまな NDK プラットフォームに含まれる「バッテリー」について私が見つけた最良の情報源は次のとおりです。

http://mobilepearls.com/labs/native-android-api/ndk/docs/STABLE-APIS.html

とにかく多くの詳細を提供しません。

于 2014-10-02T09:30:10.147 に答える