0

Android ランタイム ( ART ) にいくつかの新しい機能を挿入したので、インターフェイスを介して外部の世界に公開したいと考えています。これはネイティブ コードであるため、JNIインターフェイスを使用して、ガベージ コレクター機能と同様の方法で、この新しい機能を呼び出しますRuntime.getInstance().gc()

ただし、呼び出しを行う .dex ファイルに手動でバイトコードを挿入するため、IDE で使用できる新しい SDK を構築することは気にしません。

Runtime.javain libcore/luni、およびjava_lang_Runtime.ccinを関数artと同様の方法で編集しましたgc()。私は新しいものを生成しlibart.socore-libart.jarおり、デバイスでそれらをフラッシュしています。ただし、デバイスを再起動しようとすると、次のメッセージが表示されます。

Failed to register native method java.lang.Runtime.myMethod()V in /system/framework/core-libart.jar
...
----- class 'Ljava/lang/Runtime;' cl=0x0 -----
vtable (24 entries, 11 in super):
// 24 entries are listed here. My entry is missing.
...

ではRuntime.java、ネイティブ メソッドを登録し、@hide を使用してフル ビルドでいくつかの警告を抑制します。例えば、

/** @hide */
public native void myMethod();

ではjava_lang_Runtime.cc、関数 (ART 内部のものを呼び出す) を定義し、マクロを使用して gMethods[] 配列に登録します。例えば、

static void Runtime_myMethod(JNIEnv*, jclass) {  
// body
}

NATIVE_METHOD(Runtime, myMethod, "()V")

デバイスはブートループにあります。編集する必要のある他のファイルはありますか? 追加のモジュールをビルドするか、デバイス上の他のファイルを送信する必要がありますか?

ところで、 APKファイルに注入するため、新しいSDKものを構築したくありません。基本的には、Runtime インスタンスを取得してからメソッドを呼び出します。myMethodDalvik bytecode

4

1 に答える 1