如何在我的共享库中包含使用libdvm.so的正确包含文件?

时间:2012-10-07 06:55:55

标签: android c android-ndk include dalvik

我想使用下面的API,它位于dalvik / vm / native / dalvik_system_DexFile.cpp:

  

static void Dalvik_dalvik_system_DexFile_defineClass(const u4* args, JValue* pResult)

     

static void Dalvik_dalvik_system_DexFile_openDexFile_bytearray(const u4* args, JValue* pResult)

但我不知道如何在libdvm.so中包含使用上述两个API的正确包含文件。

我试图在android项目中包含整个标题,但是它失败了这个编译错误消息:“参数列表太长了”。

有人知道在libdvm.so中使用上述两个API需要做些什么吗? 谢谢。

- 已添加 -

在dalvik / vm / native / dalvik_system_DexFile.cpp中,还有一些额外的代码允许其他人使用静态API。

const DalvikNativeMethod dvm_dalvik_system_DexFile[] =
{ 
{ "openDexFile", "(Ljava/lang/String;Ljava/lang/String;I)I", Dalvik_dalvik_system_DexFile_openDexFile },
{ "openDexFile", "([B)I", Dalvik_dalvik_system_DexFile_openDexFile_bytearray },
{ "closeDexFile", "(I)V", Dalvik_dalvik_system_DexFile_closeDexFile },
{ "defineClass", "Ljava/lang/String;Ljava/lang/ClassLoader;I)Ljava/lang/Class;", Dalvik_dalvik_system_DexFile_defineClass },
{ "getClassNameList",   "(I)[Ljava/lang/String;", Dalvik_dalvik_system_DexFile_getClassNameList },
{ "isDexOptNeeded",     "(Ljava/lang/String;)Z", Dalvik_dalvik_system_DexFile_isDexOptNeeded },
{ NULL, NULL, NULL },
};

我将调用以上2个静态API:

  

dvm_dalvik_system_DexFile[1].fnPtr(args, &pResult);

1 个答案:

答案 0 :(得分:2)

这些是DexFile类中相应方法的JNI实现。它们通常在java级别调用,通过调用,例如DexFile.defineClass()方法,或者在JNI级别,通过使用普通的JNI来调用该java方法。

但请注意,这些方法都不是公共API的一部分,您不能依赖它们存在或具有特定原型。

如果您想加载自己的自定义类,请查看DexClassLoader类。另外,这里有一个关于使用DexClassLoader的相关blog article