2016-10-11 24 views
1

AndroidスタジオでNDK Cmakeビルドシステムを使用する場合、プラットフォーム\ android-XX \ arch-arm \ usr \ lib * .aライブラリをリンクすることはできますか?静的ライブラリlibm.aまたはlibc.aをNDK cmakeにリンクする

target_link_libraries(hello-jni libm.a android log) 

が正常にビルド:(追加libm.aを)修正と次のようにhttps://github.com/googlesamples/android-ndk/blob/master-cmake/hello-jni/app/src/main/cpp/CMakeLists.txt

:私は、変更ファイルを、私はサンプルアプリケーションの変更を試してみました13

LLVMツールチェーンとAndroid NDKを使用しています

0x00000001 (NEEDED)      Shared library: [libandroid.so] 
0x00000001 (NEEDED)      Shared library: [liblog.so] 
0x00000001 (NEEDED)      Shared library: [libm.so] 
0x00000001 (NEEDED)      Shared library: [libdl.so] 
0x00000001 (NEEDED)      Shared library: [libc.so] 

も追加すると、それが悪化libc.aは、建物が失敗する:しかし、readelfが-dはまだlibm.soリンクされていることが明らかになった

Error:error: relocation overflow in R_ARM_THM_JUMP11 
Error:error: linker command failed with exit code 1 (use -v to see invocation) 

私は時々、何の説明もせずに最後のエラーが表示されます(ライブラリ名のスペルミスなど)。もっと詳細を見るには-vフラグを設定する必要がありますか?どうやってするの?

+2

あなたのアプリに静的にlibcをリンクすると、痛いだけです。 Zygoteは同じグローバルデータの複製コピーを持ち、2つは矛盾しています。 –

+0

@DanAlbertわかりました。間違いなくライブラリのユーザが共有する、libc.aの内部で使用されているいくつかのグローバルデータについて話していますか? – jozols

+0

スタティックライブラリから必要な部分だけをリンクし、グローバルデータの問題を回避することは可能でしょうか?私は静的リンクリンカのインポートだけで必要なものと思う。 – jozols

答えて

1

これをコンパイルしたいのであれば、clangの代わりにarm-linux-androideabi-gccを使用しようとします。私はgccが償却されていることを認識しています。しかし、あなたの目標が問題をコンパイルまたは理解することであれば、私はできません。ダンさんのコメントから判断すると、私は彼が、彼はAOSPが役立つでコメントしたフラグのいずれかを考えていないと仮定してい

https://android.googlesource.com/platform/build/+/master/core/clang/config.mk

FWIW、私は常に静的LIBSを使用する傾向がある(下記のリンクを参照してください)私は彼らを必要とする数多くのことに取り組んでいるので、私はそうしています。 bionics libcに含まれているsdkバージョン間のシンボルには、あまりにも多くの矛盾がありがちです。これは、libc.aを使用するために必要なものを静的にリンクするためのものです。静的なlibcのndk版を使うつもりなら、24の代わりにプラットフォーム21を使うことをお勧めします。

私は、Androidは断片化されており、すべてのデバイスが異なるlibc.so、libdl.soそれはあまりにも多くの問題を引き起こすことはできません。

EDIT:質問を誤読しました。

+0

build.gradle(app)でminSdkVersionを15に設定すると、リンカはそのフォルダからlibc.aをリンクしようとしました。 readSelfはまだlibc.soを表示しますが、minSdkVersionを21に変更するとlibc.aの正しいバージョンが使用され、すべてが正常にコンパイルされましたが、それはネイティブライブラリの他の部分が必要とするためです。しかし、共有ライブラリの読み込みは、gccとclangの両方で失敗します。静的なlibc.aが使われているときだけです: 'SIGSEGV(シグナルSIGSEGV:アドレスアクセス保護された(フォールトアドレス:0x206e7777))' 静的バージョンのlibcはDanによって言及されたものを共有しました。 – jozols

+0

共有ライブラリを作成している場合、libc.aにリンクすることはできません。libc.soを使用する必要があります(もちろん可能ですが、ダン氏のように良い考えではありません)。実行可能ファイル。ちょっと分かりましたが、なぜ共用ライブラリを作るときに静的なライブラリを使いたいのですか?正直なところ、libcを除いて必要なライブラリすべての静的バージョンを含むことができます。しかし、あなたの目標が共有ライブラリを作成することになっている場合、それらを静的にリンクさせたいと思っている理由については、私は再び確信していません。 – Surge1223

+0

最終的な目標は* .soを* .aにも変換することでした。誰かが私のライブラリを悪用しようとすると、C関数(memcpyなど)を簡単にオーバーライドするのを避けるために静的リンクをしたいと思います。これらの関数はデータ上で動作するので、私は隠したいと思っています。このコンテキストで、静的ライブラリを実行可能ライブラリまたは共有ライブラリにリンクすることの違いは何ですか? – jozols

関連する問題