JNI:返回用户定义的java类时要使用什么签名?

时间:2017-05-30 05:58:02

标签: java c++ java-native-interface signature

基于此file,完全限定类签名为Lfully-defined-class。 恩。 String - > Ljava/lang/string

用户定义的类怎么样?他们还被认为是完全定义的阶级吗? 例如,我创建了一个类Container。我可以使用"LContainer"作为签名吗?我知道我的其他代码在我使用简单的String时可行但是当我用我自己的用户定义的类替换它时,由于某些原因我可能会丢失,它不再起作用了。

getClass是一个返回Container类型值的静态方法。我的签名是否正确? ()LContainer

jmethodID mid = env->GetStaticMethodID(clazz, "getClass", "()LContainer")

请让我知道你的想法。提前致谢

2 个答案:

答案 0 :(得分:1)

Oracle JavaOpenJDK提供有助于JNI签名的javap工具。

例如,要查找probablePrime类中BigInteger方法的签名:

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文件提供类路径。

虽然这并没有直接为你提供类的签名,但肯定有一些引用该类的方法或字段,所以可以在某处找到类描述符。

答案 1 :(得分:0)

假设Container位于包com.contosso中,您需要"()Lcom/contosso/Container;"

我不知道如何处理Container在默认包中的情况。显而易见的工作是将其移动到一个包中: - )

感谢user2543253指出了规范中缺少的分号