Java 具有派生类型参数的JNI方法签名

Java 具有派生类型参数的JNI方法签名,java,android,java-native-interface,Java,Android,Java Native Interface,据此,为了使用JNI从本机(C++)代码调用Java方法,GetMethodID函数用于: “返回类或对象的实例(非静态)方法的方法ID 接口。” 以下面的File类构造函数为例: 此构造函数的JNI方法签名为: “Ljava/io/File;(Landroid.net.Uri;)V” 但是,由于Uri是一个抽象类,是否可以使用包含从Uri派生的类型的签名来检索此构造函数的方法ID *我在问这个问题,因为我使用的环境是根据运行时对象类型自动创建实际签名,但这似乎失败了,但我不确定这是JNI的限制

据此,为了使用JNI从本机(C++)代码调用Java方法,GetMethodID函数用于:

“返回类或对象的实例(非静态)方法的方法ID 接口。”

以下面的File类构造函数为例:

此构造函数的JNI方法签名为:

“Ljava/io/File;(Landroid.net.Uri;)V”

但是,由于Uri是一个抽象类,是否可以使用包含从Uri派生的类型的签名来检索此构造函数的方法ID


*我在问这个问题,因为我使用的环境是根据运行时对象类型自动创建实际签名,但这似乎失败了,但我不确定这是JNI的限制还是签名创建代码中的错误,方法的签名是由它自己的源代码决定的,而不是由你想用什么来调用它。如果您只有实际的参数列表而不是正式的parmaeter类型,那么您没有足够的信息在运行时生成它

但我无法理解为什么您首先希望或需要在运行时生成它,或者为什么您希望或需要通过JNI来实现这一点。也许你应该看看
java.beans.Statement
和friends

我使用的环境是根据运行时对象类型自动创建实际签名


不,你不是,因为这是不可能的。您误解了,或者您正在尝试做不可能的事情。

“是否可以使用包含从Uri派生的类型的签名检索此构造函数的方法ID?…但在本例中似乎失败。”因此,您的问题的答案似乎是“否”。这就是你要问的吗?如果没有,你应该澄清这个问题。稍微修改一下我的问题。我不是JNI专家,我不确定它是否会因为JNI不支持而失败。我怀疑您必须使用反射(
class.getConstructors()
,并检查参数类型),但我也不是JNI专家,所以我不能确定。如果使用反射,那么一旦拥有了正确的
构造函数
,就不必构建字符串签名。
public File(Uri uri)