我在 Android 运行时 ( ART ) 中插入了一些新功能,现在我想通过接口将其公开给外界。由于它是本机代码,我将使用JNI接口调用这个新功能,与垃圾收集器功能类似:Runtime.getInstance().gc().
但是,我不关心构建一个可供 IDE 使用的新 SDK,因为我将手动将字节码注入到 .dex 文件中以进行调用。
我已经用函数以类似的方式编辑了Runtime.javainlibcore/luni和java_lang_Runtime.ccin 。我正在生成新的并在设备上闪烁它们。但是,当我尝试重新启动设备时,我收到以下消息:artgc()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")
设备处于引导循环中。还有其他我应该编辑的文件吗?我应该构建额外的模块,还是在设备上发送任何其他文件?
顺便说一句,我不想构建一个新SDK的调用,myMethod我将注入Dalvik bytecode一个 APK 文件。基本上我会得到Runtime实例,然后调用方法。