gpt4 book ai didi

java - 如何获取字段或方法的 JNI 风格的签名字符串?

转载 作者:行者123 更新时间:2023-11-30 02:33:05 24 4
gpt4 key购买 nike

我正在尝试检查一个 Java 类,并以一种我可以通过 Android 上的 JNI 调用它们的方式自动检索它的所有方法和字段。但是,我无法弄清楚如何以编程方式实际获取文本签名字符串;我知道如何从命令行通过 javap -s 获取它,但我想从我的程序中获取它。

我能找到的最接近的方法是使用 clazz.getMethods() 获取各个方法,然后使用 Method.toGenericString() 获取人类可读的字符串,但是当我真的只想要 JNI 风格的签名(例如 ( ILjava/lang/String;)I),因为我需要那个字符串来从 JNI 调用 getMethodID(),而且我已经有了一个完美的解析器来解析那些 JNI 签名第一名。

我可以手动维护我真正关心的从 JNI 访问的类的绑定(bind),但我更愿意让所有事情尽可能自动处理;毕竟代码越少越好。

我确实找到了为此提供辅助方法的 ASM,但它似乎是一个字节码生成框架,我不确定它是否与 Android 兼容。

或者,换句话说,给定以下类:

class SomeClass {
String foo(int bar) { return "This is foo " + bar; }
}

我想创建一个名为 ClassInspector 的类,它可以执行如下操作:

ClassInspector ci = new ClassInspector(SomeClass.class);
int n = ci.getMethodCount(); // returns 1
String name = ci.getMethodName(0); // returns "foo"
String sig = ci.getMethodSignature(0); // returns "(I)Ljava/lang/string;"

也就是说,我希望能够从 Java 中获取 javap -s 的输出,以便我可以从 native 端调用 Java 方法。

最佳答案

我遇到了同样的问题,但找不到“干净”的解决方案。

最后,我决定创建一个具有相同方法但声明为 native 的虚拟类。然后我使用 javah 创建头文件,并从该头文件中获取签名。

我知道它看起来不太好...但我找不到更好的选择(除了根据方法属性“手动”创建它)。

关于java - 如何获取字段或方法的 JNI 风格的签名字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27005501/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com