8

AndroidでJavaアプリケーションのコマンドラインバージョンを実行する必要があります(簡単ではないことはわかっています)。

Dalvikvm を使用して起動しようとしていますが、実際には起動しますが、android.util.log の使用を開始してこの例外をスローするため、後でコードが失敗します。

java.lang.UnsatisfiedLinkError: println_native
    at android.util.Log.println_native(Native Method)
    at android.util.Log.i(Log.java:159)
    at org.slf4j.impl.AndroidLogger.info(AndroidLogger.java:151)
    at org.gihon.client.TunnelingClient.<init>(TunnelingClient.java:62)
    at org.gihon.client.CLI.main(CLI.java:95)
    at dalvik.system.NativeStart.main(Native Method)

環境変数を設定してみました。LD_LIBRARY_PATH および BOOTCLASSPATH 変数を設定しました。LD_PRELOAD を使用して liblog をプリロードしようとしましたが、何も修正されませんでした。dalvikvm が環境を設定する方法に何か問題がある/異なるようです。

4

2 に答える 2

13

良い質問!これを理解するには、少し掘り下げる必要がありました。

libandroid_runtime.so には多数の JNI メソッドがあり、dalvikvm コマンドを使用している場合、デフォルトではバインドされません。残念ながら、System.loadLibrary("android_runtime") だけを実行することはできません。これは、実際にはすべてのネイティブ メソッドをバインドしないためです。

ただし、掘り下げた後、com.android.internal.util.WithFramework と呼ばれる内部の非公開のクラスが存在することが保証されていないことが判明しました。このクラスの目的は、libandroid_runtime.so をロードし、そのすべての JNI メソッドをバインドすることです。

com.android.internal.util.WithFrameworkこれを使用するには、次のように、dalvikvm コマンドでクラス名の前にスローします。

dalvikvm -cp /some/path/classes.dex com.android.internal.util.WithFramework my.example.cls "This is an argument"

(注: これは、M で WithFramework クラスが削除されたため、M より前のデバイスでのみ機能します。@JaredRummler にご連絡いただきありがとうございます)

于 2012-10-21T19:45:19.583 に答える
6

Android Mの場合、この方法が機能することがわかりました。
jar\zip ファイルに添付する helloworld.sh スクリプトを作成します。

#!/system/bin/sh
# Copied by example from am command
base=/system
export CLASSPATH=/path/to/your/jar/HelloWorld.jar
exec app_process $base/bin HelloWorldMainClass "$@"

app_processは、すべての Java クラスと共有ライブラリがロードされた状態で Java コードを開始するように見えるため、android.util.log.Log などの SDK クラスと、他の adb シェル コマンドで使用される「秘密の」ネイティブ クラス (ActivityManagerNative など) の両方を使用できます。 SDK には存在しません。

ところで、私が作成した Java シェル コマンドについては、上記のクラスにリフレクションを使用することに頼らなければなりませんでした。なぜなら、AOSP 全体のクローンを作成してビルドしないと適切にコンパイルする方法がないように思われるからです...
誰かがより簡単な方法を知っている場合たとえば、リフレクションなしでJavaコードでActivityManagerNativeを使用するには、助けていただければ幸いです。

于 2015-12-10T15:20:34.900 に答える