Androidの解決java.lang.UnsatisfiedLinkError: dlopen failed: ××××.so: has text relocations
1、問題
プロジェクトは他の人のsoを導入して、1つのプロジェクトは大丈夫で、しかしこれは問題があって、実行はこのエラーをヒントします
2、一時的な回避策
現在のプロジェクトtargetSdkValersonバージョンを下げる:such as、また24を22に変えることで、問題を解決することができます(ソースコードがない場合)
6.0以前は警告が1つしか発生しませんでしたが、text relocationsを含む共有ライブラリを正常にロードすることはできますが、6.0からSDK Version>=23の場合、text relocationsを含む共有ライブラリのロードを拒否し、エラーログを出力します.根本的な原因は、so動的リンクライブラリのコードがPIC(Position independent code)ではないためです.
最善の方法はソースコードを修復してコンパイルすることです.ここでは他の人のsoを呼び出します.仕方がありません.自分のsoであれば、NDKでsoをコンパイルするときにAndroidを配置します.mkは、PIC関連の構成項目を追加し、コンパイルされたsoファイルにtext relocationsの問題がなくなります.具体的な構成は次のとおりです.
3、soの位置決め方法に問題がある
どのsoファイルを位置決めするかtext relocationsの問題があります.次のコマンドです.
異常:
これさえあればおかしい
プロジェクトは他の人のsoを導入して、1つのプロジェクトは大丈夫で、しかしこれは問題があって、実行はこのエラーをヒントします
java.lang.UnsatisfiedLinkError: dlopen failed: ××××.so: has text relocations
2、一時的な回避策
現在のプロジェクトtargetSdkValersonバージョンを下げる:such as、また24を22に変えることで、問題を解決することができます(ソースコードがない場合)
android:targetSdkVersion="22"
6.0以前は警告が1つしか発生しませんでしたが、text relocationsを含む共有ライブラリを正常にロードすることはできますが、6.0からSDK Version>=23の場合、text relocationsを含む共有ライブラリのロードを拒否し、エラーログを出力します.根本的な原因は、so動的リンクライブラリのコードがPIC(Position independent code)ではないためです.
最善の方法はソースコードを修復してコンパイルすることです.ここでは他の人のsoを呼び出します.仕方がありません.自分のsoであれば、NDKでsoをコンパイルするときにAndroidを配置します.mkは、PIC関連の構成項目を追加し、コンパイルされたsoファイルにtext relocationsの問題がなくなります.具体的な構成は次のとおりです.
LOCAL_LDFLAGS += -fPIC
3、soの位置決め方法に問題がある
どのsoファイルを位置決めするかtext relocationsの問題があります.次のコマンドです.
readelf -a path/to/yourlib.so | grep TEXTREL
異常:
readelf -a 2.so | grep TEXTREL
0x00000016 (TEXTREL) 0x0
これさえあればおかしい
0x00000016 (TEXTREL) 0x0