2017-06-04 153 views
1

根据该link的参数,以便调用从本地Java方法(C++)代码JNI方法签名,所述的GetMethodID功能用于:使用JNI派生类型

“返回该方法ID一个类或接口的实例(非静态)方法。“

考虑,作为一个例子,所述文件类的以下构造:

public File(Uri uri) 

对于此构造甲JNI方法签名是:

“Ljava/IO/(Landroid.net.Uri;)V“

但是,因为Uri是抽象类,是否有可能使用包含从Uri派生的类型的签名来检索此构造函数的方法ID?我正在问这个问题,因为我使用的环境是基于运行时对象类型自动创建实际签名,但似乎失败了,但我不确定它是否限制了JNI或签名创建代码中的一个错误,或者其他的东西。

+1

*“是否有可能使用包含从Uri派生的类型的签名来检索此构造函数的方法ID?......但在这种情况下似乎失败。”*因此,您的问题的答案将会出现成为“不”。你在问什么?如果不是,你应该澄清这个问题。 – Radiodef

+1

稍微修改了我的问题。我不是JNI专家,我不确定它是否因为JNI不支持而失败。 –

+1

我怀疑你将不得不使用反射('class.getConstructors()'和检查参数类型),但我不是JNI专家,所以我不能肯定地说。如果你使用反射,[JNI有一个转换函数](http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#reflection_support),所以你不必一旦你拥有了正确的'Constructor',就可以建立一个字符串签名。 – Radiodef

回答

2

方法的签名由其自己的源代码确定,而不是由您想要调用的方法确定。如果你拥有的只是实际的参数列表而不是正式的parmae​​ter类型,那么你没有足够的信息在运行时生成它。

但我不明白你为什么会想需要运行时首先生成它,或者你为什么会想要或需要通过JNI来做到这一点也许你应该看看java.beans.Statement和朋友。

我使用的是在实际的签名被自动创建基于运行时的对象类型

的环境不,你不是,因为这是不可能的。你误会了,或者你正在尝试不可能的事情。