JNI:返回用户定义的 java class 时使用什么签名?
JNI: What signature to use when returning a user defined java class?
基于此 file 完全合格的 class 签名是 Lfully-defined-class
。
前任。 String
--> Ljava/lang/string
用户定义class怎么样?他们也被认为是完全定义的-class吗?
例如我创建了一个 class Container
。我可以使用 "LContainer"
作为签名吗?我知道我的其他代码在我使用简单的字符串时有效,但是当我用我自己的用户定义的 class 替换它时,由于某种原因我可能会丢失,它不再有效。
getClass
是 returns 一个 Container
类型值的静态方法。我的签名正确吗? ()LContainer
jmethodID mid = env->GetStaticMethodID(clazz, "getClass", "()LContainer")
请告诉我您的想法。提前致谢
假设 Container
在包裹 com.contosso
中,您需要 "()Lcom/contosso/Container;"
我不知道你会如何处理 Container
在默认包中的情况。显而易见的解决方法是将其移动到一个包中:-)
感谢 user2543253 指出规范中缺少的分号
Oracle Java and OpenJDK 提供有助于 JNI 签名的 javap
工具。
比如在BigInteger
class中找到probablePrime
方法的签名:
javap -s java.math.BigInteger | grep -A 2 "probablePrime"
public static java.math.BigInteger probablePrime(int, java.util.Random);
descriptor: (ILjava/util/Random;)Ljava/math/BigInteger;
—与 java
一样,提供 class 已编译 .class 文件的路径。
虽然这不能让您直接获得 class 的签名,但肯定有一些方法或字段引用了 class,因此可以在某处找到 class 描述符。
基于此 file 完全合格的 class 签名是 Lfully-defined-class
。
前任。 String
--> Ljava/lang/string
用户定义class怎么样?他们也被认为是完全定义的-class吗?
例如我创建了一个 class Container
。我可以使用 "LContainer"
作为签名吗?我知道我的其他代码在我使用简单的字符串时有效,但是当我用我自己的用户定义的 class 替换它时,由于某种原因我可能会丢失,它不再有效。
getClass
是 returns 一个 Container
类型值的静态方法。我的签名正确吗? ()LContainer
jmethodID mid = env->GetStaticMethodID(clazz, "getClass", "()LContainer")
请告诉我您的想法。提前致谢
假设 Container
在包裹 com.contosso
中,您需要 "()Lcom/contosso/Container;"
我不知道你会如何处理 Container
在默认包中的情况。显而易见的解决方法是将其移动到一个包中:-)
感谢 user2543253 指出规范中缺少的分号
Oracle Java and OpenJDK 提供有助于 JNI 签名的 javap
工具。
比如在BigInteger
class中找到probablePrime
方法的签名:
javap -s java.math.BigInteger | grep -A 2 "probablePrime"
public static java.math.BigInteger probablePrime(int, java.util.Random);
descriptor: (ILjava/util/Random;)Ljava/math/BigInteger;
—与 java
一样,提供 class 已编译 .class 文件的路径。
虽然这不能让您直接获得 class 的签名,但肯定有一些方法或字段引用了 class,因此可以在某处找到 class 描述符。