【问题标题】:How can I include proper include files for using libdvm.so at my shared library?如何在我的共享库中包含正确的包含文件以使用 libdvm.so?
【发布时间】:2012-10-07 06:55:55
【问题描述】:

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

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);

【问题讨论】:

    标签: android c android-ndk include dalvik


    【解决方案1】:

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

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

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

    【讨论】:

    • 要添加到这个答案,您可以从本机代码调用这些方法,但只能通过 JNI 调用,就像它们是普通的 Java 方法一样。无论哪种情况,您都不需要 C 标头来调用它们。
    • "或者在 JNI 级别,通过使用普通的 JNI 东西来调用该 java 方法。" :)
    猜你喜欢
    • 2020-03-31
    • 2018-08-12
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2016-02-22
    • 1970-01-01
    相关资源
    最近更新 更多