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