Java 如何为字段或方法获取JNI样式的签名字符串?

Java 如何为字段或方法获取JNI样式的签名字符串?,java,android,android-ndk,java-native-interface,Java,Android,Android Ndk,Java Native Interface,我试图检查一个Java类,并自动检索它的所有方法和字段,以便通过Android上的JNI调用它们。但是,我不知道如何以编程方式实际获取文本签名字符串;我知道如何通过javap-s从命令行获取它,但我希望从我的程序中获取它 我能找到的最接近的方法是使用clazz.getMethods()获取单个方法,然后使用Method.toGenericString()获取人类可读的字符串,但该字符串的格式类似于Java代码签名(例如public int-somethod(int-foo,Java.lang.s

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

我能找到的最接近的方法是使用
clazz.getMethods()
获取单个方法,然后使用
Method.toGenericString()
获取人类可读的字符串,但该字符串的格式类似于Java代码签名(例如
public int-somethod(int-foo,Java.lang.string-bar)
)当我真的只需要JNI风格的签名(例如,
(ILjava/lang/String;)时,我
),因为我需要该字符串从JNI调用
getMethodID()
,我已经有了一个非常好的解析器来解析这些JNI签名

我可以手动维护我真正关心的从JNI访问的类的绑定,但我更愿意让一切尽可能自动地处理;毕竟,代码越少越好

我确实找到了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
的输出,这样我就可以从本机调用Java方法。

我也遇到了同样的问题,我没有找到“干净”的解决方案

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


我知道它看起来不好看。。。但我没有找到更好的选项(除了基于方法属性手动创建它)。

我不寻找C++方法签名,而且这比使用<代码> JavaP- s<代码>更迂回。我想要的是能够从正在运行的程序中以编程方式获取JNI方法签名字符串。我将更新我的问题以澄清。此外,为了进一步澄清,我所说的“JNI方法签名”是指用于从JNI调用Java方法的签名,而不是用于实现本机方法以使其Java可调用的签名。我知道您在寻找这个:我知道您在寻找这个:
(II)Z
。这是接收两个整数作为参数并返回布尔值的方法的签名。除了创建自己的方法解析器外,我没有找到在运行时获取该签名的方法。但是javah实用程序创建了一个C头文件,其中包括声明在其上的
本机
方法的签名。javah为每个方法生成以下文档:
/**Class:com\u foo\u mypackge*方法:myJniMehod*签名:(II)Z*/