Android ランタイム ( ART ) にいくつかの新しい機能を挿入したので、インターフェイスを介して外部の世界に公開したいと考えています。これはネイティブ コードであるため、JNI
インターフェイスを使用して、ガベージ コレクター機能と同様の方法で、この新しい機能を呼び出しますRuntime.getInstance().gc()
。
ただし、呼び出しを行う .dex ファイルに手動でバイトコードを挿入するため、IDE で使用できる新しい SDK を構築することは気にしません。
Runtime.java
in libcore/luni
、およびjava_lang_Runtime.cc
inを関数art
と同様の方法で編集しましたgc()
。私は新しいものを生成しlibart.so
てcore-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 インスタンスを取得してからメソッドを呼び出します。myMethod
Dalvik bytecode