7

DalivikランタイムとARTランタイムの両方を備えた Android KitKat で常に動作するネイティブ アプリケーションがありますが、 Android Lでは次のトレースでクラッシュします。

E/art(12810): dlopen("/data/app-lib/com.mylib.example", RTLD_LAZY) failed: dlopen failed: cannot locate symbol "issetugid" referenced by "mylib.so"...
D/AndroidRuntime(12810): Shutting down VM
E/AndroidRuntime(12810): FATAL EXCEPTION: main
E/AndroidRuntime(12810): Process: com.mylib.example, PID: 12810
E/AndroidRuntime(12810): java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "issetugid" referenced by "mylib.so"...
E/AndroidRuntime(12810):    at java.lang.Runtime.loadLibrary(Runtime.java:364)
E/AndroidRuntime(12810):    at java.lang.System.loadLibrary(System.java:610)

Android L の ART ランタイムは KitKat とは異なりますか? 利用可能な新しい NDK はまだないため、機能issetugidがサポートされなくなっているように見えるため、このクラッシュを回避する方法を説明します。

4

2 に答える 2

1

この問題は、Android 5.0 の最終リリースで修正されています。既存のバイナリを再コンパイルする必要はありません。

ただし、ネイティブ ライブラリがターゲットandroid-21でコンパイルされている場合、以前の Android バージョン (< 5.0) では失敗します。

于 2014-11-13T16:50:23.913 に答える
0

私は答えがあるかもしれないと思います.間違っている場合は修正してください.私は同様の問題に直面していましたが、現在は修正されています(または回避策を見つけました)

ネイティブメソッドを JNI に登録する場合、2 つの方法があります。

1) .cpp ファイルに JNI_OnLoad() メソッドを実装し、ネイティブ メソッドを適切なクラスに登録します。チェック- http://developer.android.com/training/articles/perf-jni.html#native_libraries 例 - https://android.googlesource.com/platform/development/+/master/samples/SimpleJNI/jni/native .cpp

2) ネイティブ メソッドには特定の命名規則があり、クラス パス (パッケージを含む) を追加する必要があります。チェック - http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp615 ここでは、メソッドを実装する必要はありません。JVM は、バイナリのシンボル名からネイティブ メソッドを検出します。

最初の方法は、Android ART ランタイムでは機能しないようです (ART は kitkat ではオプションであり、Lolipop では唯一のランタイムになります)。なぜ機能しないのかわかりません。しかし、その理由はARTの実行方法にあると思います(バイトコードは、実行時ではなくインストール時に変換およびキャッシュされるため、アプリの実行が高速になります)。したがって、ネイティブ ライブラリがロードされていない (on_load が呼び出されていない) ため、マシン コードへの変換はある時点で失敗します。

2 番目の方法を使用してネイティブを登録します。それはうまくいくはずです。唯一の欠点は、関数名が長くなり、恐ろしく見えることです(100文字の制限に収まる関数はないと思います)さようなら関数名の読みやすさ。

お役に立てれば

乾杯、シュリッシュ

于 2014-10-28T19:39:18.507 に答える