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 工具。

比如在BigIntegerclass中找到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 描述符。